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;
}
uva 10009
uva11463