https://vjudge.net/problem/CodeForces-129B

题意:

有n个学生,他们之间被鞋带缠住了。现在,老师首先把所有只与一个学生直接相连的学生找出来,让他们聚集到一起,然后把他们踢出去,直到无人可踢为止。问可以踢多少次。

思路:

用拓扑排序的思路,从所有点的度数下手。将所有度数为1的点入队,之后把他们连接的点的度数全部减一,自己也减1,之后再把所有的度数为1的点入队,循环,直到队列为空。

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <queue>
 4 #include <vector>
 5 using namespace std;
 6 
 7 int d[105];
 8 
 9 queue<int> q;
10 vector<int> v[105];
11 
12 int main()
13 {
14     int n,m;
15 
16     scanf("%d%d",&n,&m);
17 
18     for (int i = 0;i < m;i++)
19     {
20         int a,b;
21 
22         scanf("%d%d",&a,&b);
23 
24         d[a]++;d[b]++;
25 
26         v[a].push_back(b);
27         v[b].push_back(a);
28     }
29 
30     for (int i = 1;i <= n;i++)
31     {
32         if (d[i] == 1) q.push(i);
33     }
34 
35     int ans = 0;
36 
37     while (!q.empty())
38     {
39         int cnt = 0;
40 
41         int b[105];
42 
43         while (!q.empty())
44         {
45             b[cnt++] = q.front();q.pop();
46         }
47 
48         if (cnt > 0) ans++;
49 
50         for (int i = 0;i < cnt;i++)
51         {
52             int t = b[i];
53             d[t]--;
54 
55             for (int j = 0;j < v[t].size();j++)
56             {
57                 int s = v[t][j];
58 
59                 if (d[s] >= 1)
60                 {
61                     d[s]--;
62                 }
63             }
64         }
65 
66         for (int i = 1;i <= n;i++)
67         {
68             if (d[i] == 1) q.push(i);
69         }
70     }
71 
72     printf("%dn",ans);
73 
74     return 0;
75 }

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!