【HDU 1272】【並查集】小希の迷宮


すみません、私も何か考えを忘れました...今度私..場合
....覚えてる...
補充します.の今は自習してます...
#include "stdio.h"
int pre[100001],max;
int flag,a[100001],b[100001];
int find(int x);
void join(int x,int y);
int main(int argc, char const *argv[])
{
    int i,k,m;
    while(~scanf("%d%d",&a[1],&b[1]))
    {
        max=-1;
        if(a[1]==-1 && b[1]==-1) break;
        if(a[1]==0 && b[1]==0)  printf("Yes
"); if(a[1]>max) max=a[1]; if(b[1]>max) max=b[1]; k=2; while(~scanf("%d%d",&a[k],&b[k])) { if(a[k]==0 && b[k]==0) break; if(a[k]>max) max=a[k]; if(b[k]>max) max=b[k]; k++; } for(i=1;i<=max;i++) pre[i]=i; flag=0; for(i=1;i<k;i++) join(a[i],b[i]); if(flag) printf("No
"); else { m=find(a[1]); for(i=1;i<k;i++) { if(find(a[i])!=m||find(b[i])!=m) { flag=1;break; } } if(flag) printf("No
"); else printf("Yes
"); } } return 0; } int find(int x) { return pre[x]==x?x:find(pre[x]); } void join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) pre[fx]=fy; else flag=1; }