uva280

注意,輸出是題目要你檢查幾的點,就做幾次輸出。

3

1 2 0

2 2 0

3 1 2 0

0

2 1 2

0

第一行的3,是這張圖的節點數

第2,3,4行,第一個數字是出發點,剩下除了0以外的點都是抵達點。

第五行的0,表示我描述完這張圖了

第六行第一個數字是我想要把幾個點當作出發點,剩下的數字是出發點的編號

再來是重複,假如想要結束輸入,則輸入0

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <math.h>
#include <vector>
#include <limits.h>
using namespace std;

int main(){
    int d[101][101];
    int n1;
    int n2,n3,n4,n5;
    int numP;
    while(1){
        scanf("%d",&n1);
        if(n1==0) break;
        numP=n1;
        for(int i=1;i<=numP;i++){//gra[0][i]不要塞東西
            for(int j=1;j<=numP;j++){
                d[i][j]=INT_MAX;
            }
        }
        while(1){
            scanf("%d",&n2);
            if(n2==0) break;
            while(1){
                scanf("%d",&n3);
                if(n3==0) break;
                d[n2][n3]=1;
            }
        }
        //floyd-warshall
        for(int k=1;k<=numP;k++)
            for(int i=1;i<=numP;i++)
                for(int j=1;j<=numP;j++)
                    if(d[i][k]!=INT_MAX && d[k][j]!=INT_MAX && d[i][k]+d[k][j]<d[i][j])
                        d[i][j]=d[i][k]+d[k][j];
        scanf("%d",&n4);
        while(n4--){
            scanf("%d",&n5);
            int ansN=0;
            vector<int> ans;
            ans.clear();
            for(int i=1;i<=numP;i++)
                if(d[n5][i]==INT_MAX)
                    ans.push_back(i);
            printf("%lu",ans.size());
            for(int i=0;i<ans.size();i++){
                printf(" %d",ans[i]);
            }
            printf("\n");
        }
    }
    return 0;
}

UVa11015

uva 10009

uva11463

results matching ""

    No results matching ""