FJ 让他的N (1 <= N <= 250)只编号为从1到N的奶牛在田地里玩.这些奶牛决定用M条(1<=M<=N*(N+1)/2)牛绳将各自连接起来.
当然,不会出现一对牛被两条及以上牛绳连接起来.输入告诉你每一条牛绳连接的两只奶牛C1和C2(1 <= c1 <= N; 1 <= c2 <= N; c1 <> c2).
FJ要求奶牛们与1号奶牛相连.现在你要帮助FJ找出所有没有与1号奶牛相连的奶牛.这里的相连既可以是直接的,也可以是间接的
(特别的,1号奶牛总是与自己相连).将没有与1号奶牛相连的奶牛的编号升序输出.如果你找不到这样的一只牛,那么就输出0.
解释一下的话,看这个有6只奶牛和4个连接的例子:
1—2 4—5
\ |
\ | 6
|
3
很明显,4,5,6号牛没有同1号牛相连.
Input
第1行:两个用空格分开的整数N,M
第2…M+1行:每一行有两个整数.第i+1行描述的是绳子i连接的两只奶牛的编号,即C1和C2.
Output
很多行:每一行包含一个整数,意义如题目所说.升序输出.
Sample Input
6 4
1 3
2 3
1 2
4 5
Sample Output
4
5
6
HINT
Source
并查集入门
————————————————————————————————————
这道题呢,其实就是一道并查集大水题,查每个点与1是否并在一个集合中,如果不在就输出。(但是本人因为忽略了没有牛连着1的话要输出0,因此WA了几遍。
*CODE
#include
using namespace std;
int n,m,father[251];
bool pd;
int find(int x)//查找
{
if(father[x]!=x)
return father[x]=find(father[x]);
else
return x;
}
int main()
{
pd=false;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
father[i]=i;
}
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
int t1=find(a),t2=find(b);
if(t1!=t2)//如果不在同一集合内
{
father[t2]=t1;//把它们并到一个集合内
}
}
for(int i=1;i<=n;i++)
{
if(find(i)!=find(1))
{
printf("%d\n",i);//输出不与1在一个集合内的牛
pd=true;
}
}
if(pd==false)
printf("0");
return 0;
}
谢谢神犇的观看,望神犇不要嫌弃。