C - How Many Tables HDU - 1213

题目大意:

      有多少桌子。开生日派对~ 朋友之间有认识的,有不认识的。如果A、B、C三个人都彼此认识的话,那么三个人可以一桌,但是A、B认识,C跟她们不熟的话,就只能AB一桌,C一个人一桌啦。那么到底需要多少张桌子。第一行输入一个T,表示测试组数。接下来每一组,第一行输入N,M。N表示人数,M表示各自关系数。接下来M行,一行两个整数,表示这两个人是朋友。(N,M<=1000)

解题思路:

     把输入的两个人连起来,其中一人根节点的id改变为另一人的根节点的id,最后总的看哪些人的id没有改变,没有改变就说明没有朋友或者是他是朋友的那个根节点,那么就要加一张桌子啦。

解题代码:

 

 1 #include <iostream>
 2 #include <vector>
 3 #include <map>
 4 #include <string>
 5 #include <queue>
 6 #include <stack>
 7 #include <set>
 8 
 9 #include <cstdio>
10 #include <cstring>
11 #include <cmath>
12 #include <cstdlib>
13 using namespace std;
14 
15 const int INF=0x3f3f3f3f;
16 const int SIZE=1e3+10;
17 
18 int id[SIZE];
19 int n;
20 
21 int find(int x)
22 {
23     while(x!=id[x])
24     {
25         id[x]=id[id[x]];
26         x=id[x];
27     }
28     return x;
29 }
30 
31 int table=0;
32 
33 void un(int p,int q)
34 {
35     int pr=find(p);
36     int qr=find(q);
37     if(pr==qr) return ;
38     id[pr]=qr;
39 }
40 
41 void clear()
42 {
43     for(int i=1;i<=n;i++)
44          id[i]=i;
45 }
46 
47 int main()
48 {
49     int t;
50     cin>>t;
51     while(t--)
52     {
53 
54         int m,a,b;
55         cin>>n>>m;
56         clear();
57         int ar,br;
58         table=0;
59         while(m--)
60         {
61             cin>>a>>b;
62             un(a,b);
63         }
64         for(int i=1;i<=n;i++)
65         {
66             if(id[i]==i) table++;
67         }
68         cout<<table<<endl;
69     }
70     return 0;
71 }
72 
73  

 

posted @ 2017-09-01 14:56  小可爱的小可爱  阅读(111)  评论(0编辑  收藏  举报