33,027
社区成员




#include <stdio.h>
#define MAXNUM 10000
#define TRUE 1
#define FALSE 0
void link(int x,int root[]);
void main(){
int refer[MAXNUM+1]={0}; //顶点参考数组,以确定某顶点是否已经出现过
int vexs[MAXNUM]={0}; //顶点数组
int root[MAXNUM]; //各不相交树结点的最远祖先
int ivex,jvex,vexnum=0,edgenum=0;
int father;
int finished=FALSE,connected=TRUE;
int i;
for(i=0;i<MAXNUM;i++) root[i]=i; //初始化,每个顶点都分别属于一个集合
while(scanf("%d%d",&ivex,&jvex)){
if(ivex==-1&&jvex==-1) break;
if(ivex==0&&jvex==0) finished=TRUE;
if(finished){ //已完成输入,判断是否符合题意
finished=FALSE;
link(vexs[0],root); //使与vexs[0]同属于一个集合的元素以统一的标志出现
father=root[vexs[0]]; //若该图联通,则所有的顶点即位于同一个集合内
for(i=0;i<vexnum;i++){ //对个顶点进行判断
link(vexs[i],root);
if(root[vexs[i]]!=father) {connected=FALSE;break;}
}//for
if(!connected) {
printf("NO!--Because the rooms don't connect each other\n");
connected=TRUE;
}//if
else if(vexnum!=(edgenum+1)) printf("NO!--Because there are cycles!\n");
else printf("YES!\n");
for(i=0;i<MAXNUM;i++){
root[i]=i; vexs[i]=0; refer[i]=0;
}//for-再次初始化
refer[MAXNUM]=0;
}//if(finished)
else{ //继续输入数据
if(refer[ivex]==0){ //还未输入过ivex
refer[ivex]=1; vexs[vexnum++]=ivex;
}
if(refer[jvex]==0){
refer[jvex]=1; vexs[vexnum++]=jvex;
}//if
edgenum++;
link(ivex,root); link(jvex,root);
root[root[ivex]]=root[jvex]; //ivex的祖先是jvex
}//else
}//while
}//main
void link(int x,int root[]){
//将x的所在集合,即x的最远祖先的所有子孙以统一标识标注。其所有子孙i的root[i]皆为该祖先y
//意味:他们皆属于以y为根的树
int father,temp;
father=x;
while(father!=root[father]) father=root[father];
while(x!=father){
temp=root[x];
root[x]=father;
x=temp;
}//while
}//link
//可以用下面的代码AC
//注意几点
//一输入就是0 0的情况
#include <iostream>
#include <cstring>
#include <map>
#include <cstdio>
using namespace std;
int p[100000];
void link(int x, int y)
{
if (x == y) return;
if (p[x] < p[y])
{
p[y] = x;
}
else
{
int t = p[x] == p[y];
p[x] = y;
p[y] -= t;
}
}
int find(int x)
{
int r = x;
while (p[r] > 0) r = p[r];
while (x != r){int s = p[x]; p[x] = r; x = s;}
return r;
}
void merge(int x, int y)
{
link(find(x), find(y));
}
int main()
{
for (;;)
{
int u, v;
scanf("%d%d", &u, &v);
if (u < 0) break;
if (u == 0) {puts("Yes");continue;}
memset(p, 0, sizeof(p));
map<int, int> mp;
int edge_count = 1;
int ok = 1;
++mp[u], ++mp[v];
merge(u, v);
if (u != v)
for (;;)
{
scanf("%d%d", &u, &v);
if (u == 0) break;
if (find(u) == find(v))
{
ok = 0;
break;
}
++edge_count;
merge(u, v);
++mp[u], ++mp[v];
}
else ok = 0;
while (u) scanf("%d%d", &u, &v);
if (ok == 1 && mp.size() - 1 == edge_count) puts("Yes");
else puts("No");
}
return 0;
}