第一次写,希望各路大神多多指点批评,对于ACM小白来说,还有许多错误或是改进的地方,请各位多多指点批评,废话不多说了。
--------------------------------------------------------------------------------------------------------------------------------
思路如下:
判断一个图是否是一棵树
没有孤立的自环点考虑每个点的入度
树:只有根结点的入度为0,其他节点的入度只能为1
只要不满足这种情况的,有多个结点入度为0,或者某个结点的入度大于1了,这样的不是树
考虑到题目中没有说输入的一组结点是不是能是相同的,如果是相同的,
就可能出现自环,这样也判断不出来,所以要考虑输入的两个数是否相同
用map保存<编号,入度>,边输入,边判断是否有某个结点的入度>1,
输入完毕后判断是否有多个入度为0的情况
注意:空树情况下,入度为0的个数也为0,需要区分开。
--------------------------------------------------------------------------------------------------------------------------------
#include <iostream>
#include <map>
#include <cstdio>
using namespace std;
int main()
{
//freopen("in.txt","r",stdin);
map<int,int> node;
int p1,p2;
int Case=0;
bool flag=true;
while(1)
{
cin>>p1>>p2;
if(p1!=0&&p2!=0&&!flag)continue;//在判断确认不是树时,并且没有完成所有操作时,跳出其他操作
if(p1==-1&&p2==-1)break;
if(p1==0&&p2==0)
{
//判断
int sum=0;
map<int,int>::iterator iter;
for(iter = node.begin();iter != node.end(); iter++)
{
if(iter->second==0)
sum++;
if(sum>1)//多个根
{
flag=false;
break;
}
}
if(sum==0&&!node.empty())//树不是空树,没有根
{
flag=false;
}
cout<<"Case "<<++Case;
if(flag)cout<<" is a tree."<<endl;
else cout<<" is not a tree."<<endl;
flag=true;
node.clear();
continue;
}
//判断是否出现自环
if(p1==p2)
{
flag=false;
continue;
}
if(node.find(p1)==node.end())//没有插入过p1,插入p1
node[p1]=0;
if(node.find(p2)==node.end())//没有插过p2,出插入p2
node[p2]=1;
else
{
node[p2]++;//p2入度+1
if(node[p2]>1)
{
flag=false;
continue;
}
}
}
//fclose(stdin);
return 0;
}