码迷,mamicode.com
首页 > 其他好文 > 详细

舞会3(同刻录光盘,并查集)

时间:2017-09-07 17:06:43      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:自身   tor   cto   刻录光盘   帮助   最小   return   数据   原因   

描述

Victoria是一位颇有成就的艺术家,他因油画作品《我爱北京天安门》闻名于世界。现在,他为了报答帮助他的同行们,准备开一个舞会。

Victoria准备邀请n个已经确定的人,可是问题来了:
这n个人每一个人都有一个小花名册,名册里面写着他能够通知到的人的名字。比如说在A的人名单里写了B,那么表示A能够通知到B;但是B的名单里不见的有A,也就是说B不见得通知到A。

Victoria觉得需要确定自己需要通知多少个人m,能够实际将所有人n都通知到。并求出一种方案以确定m的最小值是多少。

注意:自己的名单里面不会有自己的名字。Victoria可以自身通知到所有n个人。

格式

输入格式

第一行一个数n。接下来n行,每i+1行表示编号为i的人的小花名册名单,名单以0结束。\

1<=n<=200。

输出格式

一个数,m。

样例1

样例输入1

18
0
11 0
0
0
0
16 0
14 0
0
0
0
2 13 0
0
11 0
7 0
0
6 0
0
0

样例输出1

14
解题思路:
典型并查集;
注意输入部分;
vijos上数据没过,原因未知,自己看看就行;
源代码:
#include<bits/stdc++.h>
int n,m,cnt=0;
int father[220];
bool vis[220];
int find(int x)
{
    if(x!=father[x])
    father[x]=find(father[x]);
    return father[x];
}
int main()
{
    scanf("%d",&n);
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=n;i++) 
    father[i]=i;
    for(int i=1;i<=n;i++)
     {
    do
    {
        scanf("%d",&m);
        int tt=find(i);
        if(m!=0&&vis[m]==false&&find(i)!=find(m))
        {
            vis[m]=true;
            father[m]=tt;
        }
    }
    while(m!=0);} 
    for(int i=1;i<=n;i++)
    if(father[i]==i)
    cnt++;
    printf("%d",cnt);
}

 

舞会3(同刻录光盘,并查集)

标签:自身   tor   cto   刻录光盘   帮助   最小   return   数据   原因   

原文地址:http://www.cnblogs.com/gzy20020702/p/7490372.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!