| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
根本不需要用并查集来判断森林!只要判断下建好的树的根有几个就可以了~
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAX=100005;
int pre[MAX];
bool vis[MAX];
bool flag;
int main()
{
int u,v,cas=1;
while(~scanf("%d%d",&u,&v)&&(u!=-1||v!=-1))
{
if(u==0&&v==0)
{
printf("Case %d is a tree.\n",cas++);
continue;
}
memset(pre,-1,sizeof(pre));
queue<int> q;
flag=true;
if(u==v)
{
flag=false;
}
else
{
pre[v]=u;
q.push(v);
q.push(u);
}
while(scanf("%d%d",&u,&v)&&(u!=0||v!=0))
{
if(flag==false) continue;
if(pre[v]!=-1)
{
flag=false;
continue;
}
else if(u==v)
{
flag=false;
continue;
}
else if(pre[u]==v)
{
flag=false;
continue;
}
else
{
pre[v]=u;
q.push(v);
q.push(u);
}
}
if(flag==true)//判断森林
{
int num=0;
memset(vis,false,sizeof(vis));
while(!q.empty())
{
v=q.front();
q.pop();
if(vis[v]==true) continue;
vis[v]=true;
if(pre[v]==-1)
{
num++;
}
}
if(num!=1) flag=false;//判断根个数
}
if(flag) printf("Case %d is a tree.\n",cas++);
else printf("Case %d is not a tree.\n",cas++);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator