C
来源:互联网 发布:api打印编程 编辑:程序博客网 时间:2024/06/01 08:25
题目大意:
有多少桌子。开生日派对~ 朋友之间有认识的,有不认识的。如果A、B、C三个人都彼此认识的话,那么三个人可以一桌,但是A、B认识,C跟她们不熟的话,就只能AB一桌,C一个人一桌啦。那么到底需要多少张桌子。第一行输入一个T,表示测试组数。接下来每一组,第一行输入N,M。N表示人数,M表示各自关系数。接下来M行,一行两个整数,表示这两个人是朋友。(N,M<=1000)
解题思路:
把输入的两个人连起来,其中一人根节点的id改变为另一人的根节点的id,最后总的看哪些人的id没有改变,没有改变就说明没有朋友或者是他是朋友的那个根节点,那么就要加一张桌子啦。
解题代码:
#include <iostream>#include <vector>#include <map>#include <string>#include <queue>#include <stack>#include <set>#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>using namespace std;const int INF=0x3f3f3f3f;const int SIZE=1e3+10;int id[SIZE];int n;int find(int x){ while(x!=id[x]) { id[x]=id[id[x]]; x=id[x]; } return x;}int table=0;void un(int p,int q){ int pr=find(p); int qr=find(q); if(pr==qr) return ; id[pr]=qr;}void clear(){ for(int i=1;i<=n;i++) id[i]=i;}int main(){ int t; cin>>t; while(t--) { int m,a,b; cin>>n>>m; clear(); int ar,br; table=0; while(m--) { cin>>a>>b; un(a,b); } for(int i=1;i<=n;i++) { if(id[i]==i) table++; } cout<<table<<endl; } return 0;}
阅读全文
1 0