您的位置:首页 > 其它

poj 1308 Is it a Tree?

2010-11-05 02:32 351 查看
不知道为什么不能AC,这道题有2个地方特别要注意,一个是注意空树的情况存在,另外一个是在分配链表的时候别忘记了释放内存空间,不然会导致错误。

#include<iostream>
#include<vector>
#include<cmath>
#include<string>
#include<fstream>
#include<stack>
using namespace std;
const int MAX_NODE=5120;
struct Edge   //有向边的结构类型
{
int f,t;  //有向边的起点和终点索引
Edge *next;  //指向下一条有向边的指针
};
Edge* edgeList=NULL;//指向边集的头指针
int node[MAX_NODE];// i为结点node[i]的索引
int nodeNum=0;  //结点个数
int vst[MAX_NODE]; //v[i] 为从根节点遍历时,索引为i的节点被访问的次数
int GenNodeIndex(int nd);//生成结点的索引并返回,并且更新结点的个数
int EdgeNumNode(int nodeIndex);//求出指向nodeIndex的边条数
void VisitNode(int nodeIndex);  //从索引为nodeIndex的结点开始遍历其余结点
bool IsATree(); //判断是否是一棵树
int main()
{
ifstream cin("d://1.txt");
int f,t ;  //有向边的起点和终点
int T=0;  //测试数据初始化为0
Edge*p;
while(cin>>f>>t&&!(f==-1&&t==-1))
{
T++;
nodeNum=0;
while(!(f==0&&t==0))
{
p=new Edge();
p->f=GenNodeIndex(f);
p->t=GenNodeIndex(t);
p->next=edgeList;
edgeList=p;
cin>>f>>t;
}
if(IsATree())
cout<<"Case "<<T<<" is a Tree."<<endl;
else
cout<<"Case "<<T<<" is not a Tree."<<endl;
//释放内存
while(edgeList!=NULL)
{
p=edgeList;
edgeList=edgeList->next;
delete p;
}
}
system("pause");
return 0;
}
int GenNodeIndex(int nd)
{
int i=0;
//若nd已存在node中则返回其索引
for(i=0;i<nodeNum;i++)
{
if(node[i]==nd)
return i;
}
//将nd插入node尾部并且返回其索引
node[nodeNum]=nd;
nodeNum++;
return nodeNum-1;
}
int EdgeNumNode(int nodeIndex)
{
Edge* p=edgeList;
int edgeNum=0;
while(p!=NULL)
{
if(p->t==nodeIndex)
edgeNum++;
p=p->next;
}
return edgeNum;
}
void VisitNode(int nodeIndex)
{
Edge*p=edgeList;
vst[nodeIndex]++;  //结点nodeIndex访问次数加一
while(p!=NULL)
{
if(p->f==nodeIndex)
VisitNode(p->t);
p=p->next;
}
}
bool IsATree()
{
if(nodeNum==0) return true ;  //空树
int rootIndex=-1;  //设置根结点索引为-1;
for(int i=0;i<nodeNum;i++)
{
int edgeNum=EdgeNumNode(i);
if(edgeNum==0)      //树根
{
if(rootIndex==-1)
rootIndex=i;
else
return false;  //树根多于一个
}
else if(edgeNum>1) return false;  //非树根且多余1条有向边指向它
}
if(rootIndex==-1)
return false;  //没有树根
for(int i=0;i<nodeNum;i++)
vst[i]=0;
VisitNode(rootIndex);
for(int i=0;i<nodeNum;i++)
{
if(vst[i]!=1)     // 索引为i的结点被访问的次数大于1或未被访问
return false;
}
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: