http://poj.org/problem?id=1308
首先:第一道真正意义上的自己做出来的,目前认为比较有点难的POJ题目;花了我5个小时啊。其中过程是崎岖的;有几次都差点放弃了,坚持了下来;虽然在以后看来这道题目很简单,还做了五个小时,但是;大牛都是从菜鸟做起来的;ACM加油吧;但是还是有一句话:革命尚未成功,如果继续以这样的效率的话后果不看设想啊;时间不多了;努力是必须的~~^_^!!
总结:
首先:坚持!不出来一定要坚持到底~~~~如果放弃,想想 今天的最后一个错误是什么(Presentation Error ),要是放弃了,~~~~
其次:任何一个题目需要优化;即使以后成为大牛也是如此,加油吧;
还有:清晰的思路是很重要的;伪代码值得拥有~~^_^
最后:努力啊~~~~~~
Hint:
需要注意的数据
1: 0 0 空树是一棵树CODE:
2: 1 1 0 0 不是树 不能自己指向自己
3: 1 2 1 2 0 0 不是树....自己开始一直在这么WA 好郁闷 重复都不行呀~~5555
4: 1 2 2 3 4 5 不是树 森林不算是树(主要是注意自己)
5: 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 注意 一个节点在指向自己的父亲或祖先 都是错误的 即 9-->1 错
6: 1 2 2 1 0 0 也是错误的
说说我的思路:
1:入度为为0的点只有一个————根结点;
2:在1的前提下,排除之后:其他任何的入度为1;
3:在2的前提下满足以后:没有环~~~~~遭了
遭了~~遭了~~写到这里的时候发现 如果是一棵树和一个环的情况没有考虑啊,,^_^哈哈POJ上数据不严格~~~
比如说:1 2 3 4 4 5 5 3
有待改进~~~
自己期待~~~
#include <iostream>
using namespace std;
#define M 100000
typedef struct node
{
int vex;
struct node *next;
} JD ;
typedef struct tnode
{
int vexdate;
int in;
int out;
struct node *link;
} TD;
TD g[M];
int p;
int crt(TD g[])
{
int i,j,flag=0,flag1=0;
for(i=1;i<M;i++)
{
g[i].in=0;
g[i].out=0;
g[i].link=NULL;
}
while(cin>>i>>j)
{
if(i==0&&j==0) break;
if(i==-1&&j==-1) return 0;
JD *p=new JD[M];
p->vex=j;
p->next=g[i].link;
g[j].in++;
g[i].out++;
g[i].link=p;
}
return 1;
}
int judge(TD g[])
{
int count=0;int m=1;
for(int i=1;i<M;i++) // kuong shu
{
if(g[i].in==0) m++;
if(m==M) return 1;
} //空树也是树
for(int i=1;i<M;i++)
{
if(g[i].in||g[i].out) // not kong shu
{ if(g[i].in==0&&g[i].out!=0)
{count++;if(count==2) return 0;}
//根结点只有一个
else
{
if(g[i].in!=1) return 0;
//入度不为 1 的情况(0 2 3)
}
}
}
if (count==0) return 0;
//这种数据: 1 1 0 0,也就是没有根结点
return 1;
}
int main()
{
int i=0;
while(1)
{
i++;
p=crt(g);
if(!p) return 0; // -1 -1 de qing kuang
if(judge(g))
cout<<"Case "<<i<<" is a tree.\n";
else cout<<"Case "<<i<<" is not a tree.\n";
}
return 1;
}