HDU 1272 小希的迷宫

来源:互联网 发布:淘宝冠军 编辑:程序博客网 时间:2024/06/05 07:28
/*  hdu 1272 小希的迷宫 */#include<stdio.h>  #include<string.h> int nn;    //用来判断是否有重复的连通int ff[100005];//ff[x]表示x的父节点 int qq[100005];//标记数组int ss[100005];//ss[x]表示x的秩void ii(int n)    //初始化   {      for (int i=0;i<n;i++)    {ff[i] = i;ss[i] = 1;    }}    int dd(int x)    //带路径压缩的查找  {      if (x!=ff[x])    {ff[x] = dd(ff[x]);    }return ff[x];}  void cc(int a,int b)   //按秩合并  {      int ta=dd(a);int tb=dd(b);if (ta != tb){if (ss[ta] >= ss[tb]){ff[tb]=ta;if(ss[ta] == ss[tb])ss[ta]++;}elseff[ta] = tb;}elsenn=1;}  int main()  {      int i,m,a,b,t,k,j;    while(scanf("%d%d",&a,&b)&&a!=-1&&b!=-1) {    if (a==0 && b==0 )    {printf("Yes\n");    }ii(100000);        memset(qq,0,sizeof(qq));nn=0;cc(a,b);qq[a]=qq[b]=1;while(scanf("%d%d",&a,&b),a&&b) {cc(a,b);qq[a]=qq[b]=1;} for (i=0,t=0;i<=100005;i++){if (qq[i]==1 && (dd(i)==i))   //判断是不是连通********************************很重要 有两个根节点的情况就是两个根没有连起来 {t++;}}if (t==1 && !nn)       //nn判断是不是成环 *******************************很重要{ printf("Yes\n");}elseprintf("No\n");    }      return 0;  } 


需要考虑这种情况,输入的两个数字与大集体没有连接,就他俩单独成一个,显然这样是不可以的,所以标记的作用与检测顶点的作用体现出来了。

#include <iostream>#include <algorithm>using namespace std;int ff[100005];int ss[100005];int qq[100005];int res ;void ii(int x){  for(int i=0;i<x;i++)  {  ff[i] = i;      ss[i] = 1;  qq[i] = 0;  }}int dd(int x){if(x != ff[x])ff[x] = dd(ff[x]);return ff[x];}void cc(int a,int b){int ta = dd(a);int tb = dd(b);if(ta != tb){  ff[ta] = tb;}elseres = 1;}void main(){    int i,j,k;    int m,t;int n,v,w;int cnt =0;while(cin>>m>>n,m+1 || n+1){if(m==0&&n==0){cout<<"Yes"<<endl;continue;}ii(100005);res =cnt=0;        cc(m,n);qq[m]=qq[n]=1;while(cin>>m>>n,m&&n){cc(m,n);qq[m]=qq[n]=1;}for(i=1;i<100005;i++){if(qq[i]==1 && (dd(i) == i)){cnt++;}}if(res || cnt != 1)cout<<"No"<<endl;elsecout<<"Yes"<<endl;}}


0 0
原创粉丝点击