如果要输出yes 需要满足
1 这个图连通
2 没有回路
3 0 0 也是yes
看它有没有回路 在un的时候做一次判断就可以了
然后是判断连通 在这里采用的方法是扫一遍 如果这个点出现过就判断(用vis看是否出现) 然后如果它作为根节点 最后根节点只能是一个
和上次做欧拉用的判断连通办法不一样 上一个更省时间不过更麻烦吧..
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> using namespace std; int fa[100050]; int vis[100050]; bool ok; void init() { for(int i=0;i<100040;i++) { fa[i]=i; vis[i]=0; } ok=true; } int find(int i) { return fa[i]==i?i:find(fa[i]); } void un(int a,int b) { int aa=find(a); int bb=find(b); if(aa==bb) ok=false; else fa[aa]=bb; return ; } int main() { int a,b; while(~scanf("%d%d",&a,&b)) { if(a==0&&b==0) printf("Yes\n"); else { if(a==-1&&b==-1) break; init(); un(a,b); vis[a]=1; vis[b]=1; while(~scanf("%d%d",&a,&b)) { if(a==0&&b==0) break; un(a,b); vis[a]=1; vis[b]=1; } int many=0; for(int i=0;i<100040;i++) { if(fa[i]==i&&vis[i]==1) { many++; } } if(many!=1) ok=false; if(ok==true) printf("Yes\n"); else printf("No\n"); } } }
时间: 2024-09-30 06:52:57