这道题题目是中文的,所以无需多解释了,就是一个图是否能成为一个迷宫,重点是从任意一点到另一点只能有一条道,而且所有点是联通的。
所以这道题的思路就很清晰了,只要连通的,放入集合中,如果两个节点的父节点相同,即这两点之间存在别的道路可到达,即不成立。
最后,搜索一下,如果所有节点父节点一致,即都是连通的,可成立。
附上代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int m[100005],di[100005];
int find(int x)
{
return m[x]==x?x:find(m[x]);
}
int main()
{
int a,b,i;
while(scanf("%d%d",&a,&b))
{
int k,t,minn,maxn;
bool ok=1;
if(a==-1||b==-1) break;
if(a==0 &&b==0)
{
cout<<"Yes"<<endl;continue;
}
memset(di,0,sizeof(di));
for(i=1;i<=100000;i++) m[i]=i;
k=find(a);
t=find(b);
if(!di[a]) di[a]=1;
if(!di[b]) di[b]=1;
if(k==t) ok=0;
else
{
m[k]=t;
}
if(a>b)
{
minn=b;
maxn=a;
}
else
{
minn=a;
maxn=b;
}
while(scanf("%d%d",&a,&b))
{
if(a==0 && b==0) break;
if(a>b)
{
if(minn>b) minn=b;
if(maxn<a) maxn=a;
}
else
{
if(minn>a) minn=a;
if(maxn<b) maxn=b;
}
k=find(a);
t=find(b);
if(k==t) ok=0;
else m[k]=t;
if(!di[a]) di[a]=1;
if(!di[b]) di[b]=1;
}
if(!ok)
{
cout<<"No"<<endl;continue;
}
int time=0;
for(i=minn;i<=maxn;i++)
{
if(di[i]&&m[i]==i) time++;
}
if(time==1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
------------------------------------------------------------------------------------------------------
2013/11/26
添加hdu1325,与上一题思路相同,只是无向图改有向图而已
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int m[100005],di[100005];
int find(int x)
{
return m[x]==x?x:find(m[x]);
}
int main()
{
int a,b,i,tm=1;
while(scanf("%d%d",&a,&b))
{
int k,t,minn,maxn;
bool ok=1;
if(a<0||b<0) break;
if(a==0 &&b==0)
{
cout<<"Yes"<<endl;continue;
}
for(i=1;i<=100000;i++) m[i]=i;
k=find(a);
t=find(b);
if(!di[a]) di[a]=1;
if(!di[b]) di[b]=1;
if(k==t) ok=0;
else
{
m[t]=k;
}
if(a>b)
{
minn=b;
maxn=a;
}
else
{
minn=a;
maxn=b;
}
while(scanf("%d%d",&a,&b))
{
if(a==0 && b==0) break;
if(a>b)
{
if(minn>b) minn=b;
if(maxn<a) maxn=a;
}
else
{
if(minn>a) minn=a;
if(maxn<b) maxn=b;
}
k=find(a);
t=find(b);
if(k==t) ok=0;
else m[t]=k;
if(!di[a]) di[a]=1;
if(!di[b]) di[b]=1;
}
printf("Case %d is ",tm++);
if(!ok)
{
cout<<"not a tree."<<endl;continue;
}
int time=0;
for(i=minn;i<=maxn;i++)
{
if(di[i]&&m[i]==i) {time++;di[i]=0;}
}
if(time==1) cout<<"a tree."<<endl;
else cout<<"not a tree."<<endl;
}
return 0;
}