【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;
}