[360]笔试编程题

大概意思是:选镇长,规则:所选之人不认识本镇其他人;本镇其他人都认识此人。

输入

第一行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 }
View Code
原文地址:https://www.cnblogs.com/hbiner/p/4722463.html