NOJ谣言传播(并查集)

题目:点击打开链接

本题难点在于让凡是能与t联系起来的都以t为头头,,其余的代码就是基本的并查集,如果total为1,则所有人与t联系起来了,输出Yes,否则输出No.

核心代码:

            if(fa!=fb)
            {
                if(fa==t)
                    pre[fb]=t;
                else if(fb==t)
                    pre[fa]=t;
                else
                {
                    if(fa>t)
                        pre[fb]=fa;
                    else
                        pre[fa]=fb;
                }
                total--;
            }

代码:

#include <cstdio>
int pre[101000];
int Find(int x)
{
    int r=x;
    while(pre[r]!=r)
        r=pre[r];
    int i=x, j;  
    while(i!=r)
    {
        j=pre[i];
        pre[i]=r ;
        i=j;
    }
    return r ;
}

int main()
{
    int T, n, m, t, total, fa, fb, a, b;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d", &n, &t);
        scanf("%d", &m);
        total=n;
        for(int i=0; i<n; i++)
            pre[i]=i;
        while(m--)
        {
            scanf("%d%d", &a, &b);
            if(a>b)
            {
                int tmp=a;
                a=b;
                b=tmp;
            }
            fa=Find(a);
            fb=Find(b);
            if(fa!=fb)
            {
                if(fa==t)
                    pre[fb]=t;
                else if(fb==t)
                    pre[fa]=t;
                else
                {
                    if(fa>t)
                        pre[fb]=fa;
                    else
                        pre[fa]=fb;
                }
                total--;
            }
        }
        printf("%s\n",total==1?"Yes":"No");
    }

    return 0;
}

题目:

谣言传播

时间限制(普通/Java) :  4000 MS/ 12000 MS          运行内存限制 : 65536 KByte
总提交 : 707            测试通过 : 217 

比赛描述

知道“人言可畏”吗?在我们的生活中,尤其在现有的网络上,存在一些广泛传播的谣言。今天我们在一个群体中研究这个问题:

(1)一个群体中存在一些两两之间的朋友关系;

(2)一个人发布“谣言”;

(3)一个人在知道“谣言”时,会告诉他(她)的朋友;

请你判断是否所有人最终都知道谣言。



输入

第一行是一个正整数:测试用例数目,最多为100。之后,每个测试用例包括多行:

l       第1行给出两个整数(空格分隔),前者表示群体人数n,后者表示“谣言”发布者t,群体成员用整数序号表示,2≤n≤200,0≤t≤n-1

l       第2行给出一个整数,群体两两存在的朋友关系数m,0≤m≤20100

l       m行,每行两个整数(空格分隔),表示群体中两个成员存在朋友关系。

输出

对于每个测试用例:

l       所有人最终都知道谣言则输出“Yes”,否则输出“No”

注意:输出部分的结尾要求包含一个多余的空行。

样例输入

2
3 0
2
0 1
0 2
4 0
2
0 1
2 3

样例输出

Yes
No

题目来源

算法与数据结构设计考核赛2009


你可能感兴趣的:(并查集)