大概意思是:选镇长,规则:所选之人不认识本镇其他人;本镇其他人都认识此人。
输入:
第一行T,表示测试样例数;
每个测试样例包含:
第一行n和m,分别表示本镇人数(每个人分别用1到n的序号表示)和认识的关系数;
接下来m行表示,人与人之间的认识关系(每行两个数Ai和Bi,表示Ai认识Bi,但不能具备Bi认识Ai的关系,Ai和Bi可能相同,表示自己认识自己)
输出:
2T行,分别为T个测试样例的输出结果;
每个测试样例包含两行:
第一行表示此测试样例,镇长的可选人数;
第二行表示所有可行人的序号。
解题代码如下:
1 #include <iostream> 2 #define N 100000 3 #define M 300000 4 using namespace std; 5 6 int AB[M][2]; 7 int can[N]; 8 9 int gao() 10 { 11 int T, n, m, i, j; 12 //memset(AB, 0, sizeof(int)*M); 13 cin >> T; 14 while (T--) 15 { 16 cin >> n >> m; 17 for (i = 0; i < m; i++) 18 { 19 cin >> AB[i][0] >> AB[i][1]; 20 } 21 int can_cnt = 0; 22 for (j = 0; j < n; j++) 23 { 24 bool rec_other = false; 25 for (int k = 0; k < m; k++) 26 { 27 if (AB[k][0] == k && AB[k][0] != AB[k][1]) 28 { 29 rec_other = true; 30 break; 31 } 32 } 33 if (rec_other) 34 continue; 35 int be_rec_peo_cnt = 0; 36 for (int l = 0; l < m; l++) 37 { 38 if (AB[l][1] == j && AB[l][0] != AB[l][1]) 39 be_rec_peo_cnt++; 40 } 41 if (be_rec_peo_cnt == n - 1) 42 { 43 can[can_cnt++] = j; 44 } 45 } 46 cout << can_cnt << endl; 47 if (can_cnt == 0) 48 cout << endl; 49 else 50 { 51 int x; 52 for (x = 0; x < can_cnt - 1; x++) 53 cout << can[x] << " "; 54 cout << can[x] << endl; 55 } 56 } 57 return 0; 58 } 59 int main() 60 { 61 gao(); 62 return 0; 63 }