B - The Suspects 并查集

复制代码
路径压缩
Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. To minimize transmission to others, the best strategy is to separate the suspects from others. 
In the Not-Spreading-Your-Sickness University (NSYSU), there are many student groups. Students in the same group intercommunicate with each other frequently, and a student may join several groups. To prevent the possible transmissions of SARS, the NSYSU collects the member lists of all student groups, and makes the following rule in their standard operation procedure (SOP). 
Once a member in a group is a suspect, all members in the group are suspects. 
However, they find that it is not easy to identify all the suspects when a student is recognized as a suspect. Your job is to write a program which finds all the suspects.

Input
The input file contains several cases. Each test case begins with two integers n and m in a line, where n is the number of students, and m is the number of groups. You may assume that 0 < n <= 30000 and 0 <= m <= 500. Every student is numbered by a unique integer between 0 and n−1, and initially student 0 is recognized as a suspect in all the cases. This line is followed by m member lists of the groups, one line per group. Each line begins with an integer k by itself representing the number of members in the group. Following the number of members, there are k integers representing the students in this group. All the integers in a line are separated by at least one space. 
A case with n = 0 and m = 0 indicates the end of the input, and need not be processed.

Output
For each case, output the number of suspects in one line.

Sample Input
100 4
2 1 2
5 10 13 11 12 14
2 0 1
2 99 2
200 2
1 5
5 1 2 3 4 5
1 0
0 0
Sample Output
4
1
1
 
复制代码
复制代码
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
#include<vector>
#include<iomanip>
#include<iostream>
using namespace std;
#define MAXN 30000 
#define INF 0x3f3f3f3f
/*
并查集
路径压缩,把所有与0有关的都连到0上
*/
int pre[MAXN],n,m;
int find(int x)
{
    if(x==pre[x])
        return x;
    else
        return pre[x] = find(pre[x]);
}
void mix(int x,int y)
{
    int fx = find(x),fy = find(y);
    if(fx!=fy)
        pre[fy] = fx;
}
int main()
{
    while(cin>>n>>m)
    {
        if(n+m==0) break;
        for(int i=0;i<=n;i++)
            pre[i] = i;
        int k,t1,t2;
        for(int i=0;i<m;i++)
        {
            cin>>k;
            for(int j=0;j<k;j++)
            {
                if(j==0)
                    cin>>t1;
                else
                {
                    cin>>t2;
                    mix(t1,t2);
                }
            }
        }
        int cnt = 0,r;
        for(int i=0;i<n;i++)
        {
            int t1 = find(i),t2=find(0);
            if(t1==t2)
                cnt++;
        }
        cout<<cnt<<endl;
    }
    return 0;
}
复制代码

 

posted @   joeylee97  阅读(147)  评论(0编辑  收藏  举报
编辑推荐:
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
阅读排行:
· 从零开始开发一个 MCP Server!
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
点击右上角即可分享
微信分享提示