您的位置:首页 > 其它

九度题目1481:Is It A Tree?

2016-09-04 20:33 344 查看
题意:

判断是不是树的条件如下

1、只有一个根节点,根节点的入度为0

2、每个点只有一条边指向该节点

3、从根节点开始只有一条边指向该节点

输入输出格式

每一个case以 0 0 结束

-1 -1 结束所有输入样例

 

竟然还有判断有没有环,疏忽了。

#include<stdio.h>
#include<iostream>
#include<vector>
#include<string.h>
#include<queue>
#include<set>
using namespace std;
vector<int>G[100005];
vector<int>::iterator ite;
queue<int>q;
set<int>s;
int fr,to;
int maxn;
int cases;
int n;

bool vis[100005];
int degree[100005];
bool isTree()
{
while(!q.empty())
q.pop();
for(int i = 1;i<=maxn;i++)
{
if(vis[i])
{
if(degree[i]==0)
q.push(i);
else if(degree[i]>1)
return false;
}
}
if(q.size()>1)
return false;
int cnt = 0;
while(!q.empty())
{
int tmp = q.front();
q.pop();
cnt++;
for(ite = G[tmp].begin();ite!=G[tmp].end();ite++)
{
degree[*ite]--;
if(degree[*ite]==0)
q.push(*ite);
}
}
if(cnt==n)
return true;
else
return false;

}
int main()
{
cases = 0;
while(~scanf("%d%d",&fr,&to))
{
if(fr == -1&&to==-1)
break;
if(fr!=0&&to!=0)
{
maxn =max(maxn,fr);
maxn =max(maxn,to);
//if(!G[to].find(fr))
G[fr].push_back(to);
degree[to]++;
if(!vis[fr])
{
vis[fr] = 1;
n++;
}
if(!vis[to])
{
vis[to] = 1;
n++;
}

}
else if(fr==0&&to==0)
{
cases++;
int flag = 1;
int rot = 0;
//  n=s.size();
//            for(int i = 1 ; i <=maxn;i++)
//            {
//                if(vis[i]==1)
//                {
//                    degree[i] = G[i].size();
//                   // cout<<i<<endl;
//                    if(G[i].size()>1)
//                        flag = 0;
//                    else if(G[i].size()==0)
//                    {
//
//                        if(rot)
//                            flag = 0;
//                        else
//                            rot = 1;
//                    }
//                }
//
//
//            }
// cout<<flag<<" "<<rot<<endl;
if(isTree())
cout<<"Case "<<cases<<" is a tree."<<endl;
else
cout<<"Case "<<cases<<" is not a tree."<<endl;

for(int i = 1 ; i <=maxn;i++)
{
degree[i] = 0;
G[i].clear();
}
memset(vis,0,sizeof(vis));
n = 0;
}

}
return 0;
}
/*
6 8  5 3  5 2  6 4
5 6  0 0

8 1  7 3  6 2  8 9  7 5
7 4  7 8  7 6  0 0

3 8  6 8  6 4
5 3  5 6  5 2  0 0

3 8  6 8  6 4
5 3  5 6  5 2  9 1 0 0

*/


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: