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
まだまだだね