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;}


原创粉丝点击