这道题的题意很明显,给定一大堆图边的关系,判断这个图是否为一棵树。
我的算法是:
1,判断图是否为空图,如果是空的,则为空树。(空树也是树)。
2,找root判断这个图是否为一棵树。root应唯一。不唯一则不是树。
3,建立临界表。
4,从root开始层次遍历,如果遍历过程中有指向已经被访问过的点的指针,则不是树。
5,层次遍历后,如果仍有未被访问过的顶点,则说明图不是连通的,也不不会是树。
6,经过以上各步判断之后,剩下的就是树。
/*
* =====================================================================================
*
* Filename: 1308.c
*
* Description:
*
* Version: 1.0
* Created: 2011年12月18日 14时01分55秒
* Revision: none
* Compiler: gcc
*
* Author: MaZheng (blog.youkuaiyun.com/mazheng1989), mazheng19891019@gmail.com
* Company: Dalian University Of Technology
*
* =====================================================================================
*/
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define NUM 200
//please declare parameters here.
int map[NUM];
char visited[NUM];
int v_num;
struct Node
{
int v;
struct Node *next;
};
struct Node *adjTable[NUM];
int queue[NUM];
//please declare functions here.
inline int getIndex(int value)
{
int i;
for(i=0;i<=v_num;i++)
{
if(map[i]==value)
return i;
}
return -1;
}
int insertNode(int u,int v)
{
struct Node *p=adjTable[u];
while(p!=NULL&&p->v!=v)
{
p=p->next;
}
if(p!=NULL&&p->v==v)
return -1; //node existed,return fail
struct Node *n=(struct Node *)malloc(sizeof(struct Node));
n->next=adjTable[u];
n->v=v;
adjTable[u]=n;
return 0;
}
int main()
{
int u,v;
int k=0;
while(scanf("%d %d",&u,&v)!=EOF)
{
if(u==-1&&v==-1)
break;
v_num=0;
memset(map,-1,sizeof(map));
memset(visited,0,sizeof(visited));
memset(adjTable,0,sizeof(adjTable));
memset(queue,0,sizeof(queue));
char flag=0;
while(u+v!=0)
{
//input
// printf("%d %d\n",u,v);
if(getIndex(u)==-1)
{
map[v_num++]=u;
}
if(getIndex(v)==-1)
{
map[v_num++]=v;
}
visited[getIndex(v)]=1;
if(insertNode(getIndex(u),getIndex(v))==-1)
flag=1;
scanf("%d %d",&u,&v);
}
// printf("v_num=%d\n",v_num);
//output result
if(flag==1)
{
printf("Case %d is not a tree.\n",++k);
continue;
}
if(v_num==0)
{
printf("Case %d is a tree.\n",++k);
continue;
}
int i,count=0,root=-1;
for(i=0;i<v_num;i++)
{
if(visited[i]==0)
{
count++;
root=i;
// printf(" root %d ",i);
}
}
// printf("\n");
if(count>1||root==-1)
{
printf("Case %d is not a tree.\n",++k);
continue;
}
count=0;
memset(visited,0,sizeof(visited));
int front=0,tail=0;
queue[tail++]=root;
count++;
while(front<tail)
{
visited[queue[front]]=1;
struct Node *p=adjTable[queue[front++]];
while(p!=NULL&&visited[p->v]==0)
{
queue[tail++]=p->v;
count++;
p=p->next;
}
if(p!=NULL&&visited[p->v]==1)
{
count=-1;
break;
}
}
if(count!=v_num)
{
// printf("count= %d v_num=%d \n",count,v_num);
printf("Case %d is not a tree.\n",++k);
continue;
}
printf("Case %d is a tree.\n",++k);
}
return 0;
}