No
题解:这道题考察并查集的两个特点
1:判断是否属于同一个集合(可以判断是否有环(如果两者同属于一个集合则再进行联立就会有环存在))。
2:判断是否仅有一棵树(同一棵树中顶点的总和等于边数加一)。
采用book【】数组来判断点是否出现过,最后用点与边进行比较。
代码:
///HDU 1272 (小希的迷宫) #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <iostream> using namespace std; const int maxx=100005; int par[maxx]; int book[maxx];///记录点 ///寻找根结点 int find(int x) { if(par[x]==x) return x; else return par[x]=find(par[x]); } ///合并集合 int unite(int x,int y) { int fx=find(x); int fy=find(y); if(fx==fy) return 0; else par[y]=x; } int main() { int x,y; while(~scanf("%d %d",&x,&y)) { if(!x&&!y)///特殊数据(当x==0&&y==0)时输出Yes { printf("Yes\n"); continue; } if(x==-1&&y==-1) break; ///初始化根 for(int i=1;i<=maxx;i++) par[i]=i; memset(book,0,sizeof(book)); book[x]=book[y]=1; int n=1;///点的个数 int flag=1; while(~scanf("%d %d",&x,&y)) { if(x==0&&y==0) break; if(book[x]==0) { n++; book[x]=1; } if(book[y]==0) { n++; book[y]=1; } if(unite(x,y))///如果两者不在同一个集合中,则合并(边) { n--; ///同一棵树边与点的个数相差1 } else flag=0; } if(flag&&n==1)///如果仅有一棵树且无环 printf("Yes\n"); else printf("No\n"); } return 0; }