C - How Many Tables HDU - 1213

xiaoxiao2021-02-28  48

题目大意:

      有多少桌子。开生日派对~ 朋友之间有认识的,有不认识的。如果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; }

转载请注明原文地址: https://www.6miu.com/read-81212.html

最新回复(0)