题目要求:
A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=10000) which is the number of nodes, and hence the nodes are numbered from 1 to N. Then N-1 lines follow, each describes an edge by given the two adjacent nodes' numbers.
Output Specification:
For each test case, print each of the deepest roots in a line. If such a root is not unique, print them in increasing order of their numbers. In case that the given graph is not a tree, print "Error: K components" where K is the number of connected components in the graph.
Sample Input 1:5 1 2 1 3 1 4 2 5Sample Output 1:
3 4 5Sample Input 2:
5 1 3 1 4 2 5 3 4Sample Output 2:
Error: 2 components
#include <stdio.h>
#include <stdlib.h>
typedef struct link_list
{
int value;
struct link_list *next;
}ll;
int max_deep,count,n;
ll path[10001];
int droot[10001],visit[10001];
void init(int *v);
int dfs(int root,int deep);
int main(int argc,char* argv[])
{
int i,j,x,y,components;
ll *list,*last;
//freopen("input","r",stdin);
scanf("%d",&n);
//init path link list
for(i=1;i<=n;i++)
{
path[i].value = i;
path[i].next = NULL;
}
//scanf path matrix
for(i=0;i<n-1;i++)
{
scanf("%d%d",&x,&y);
list = (ll *)malloc(sizeof(ll));
list->value = y;
list->next = NULL;
last = &path[x];
while(last->next != NULL)
last = last->next;
last->next = list;
list = (ll *)malloc(sizeof(ll));
list->value = x;
list->next = NULL;
last = &path[y];
while(last->next != NULL)
last = last->next;
last->next = list;
}
//dfs from each node
for(i=1;i<=n;i++)
{
max_deep = count = 0;
init(visit);
visit[i] = 1;
count += 1;
dfs(i,0);
if(count < n)
break;
droot[i] = max_deep;
}
//not connected
if(count < n)
{
init(visit);
components = 0;
for(i=1;i<=n;i++)
{
if(!visit[i])
{
components += 1;
dfs(i,0);
}
}
printf("Error: %d components\n",components);
return 0;
}
//print the deepest root
max_deep = 0;
for(i=1;i<=n;i++)
{
if(max_deep < droot[i])
max_deep = droot[i];
}
for(i=1;i<=n;i++)
{
if(droot[i] == max_deep)
printf("%d\n",i);
}
return 0;
}
void init(int *v)
{
int i;
for(i=1;i<=n;i++)
visit[i] = 0;
}
int dfs(int root,int deep)
{
int i,value;
ll *node = &path[root];
int this_deep = deep;
if(node->next == NULL)
return 0;
while(node->next != NULL)
{
value = node->next->value;
if(!visit[value])
{
visit[value] = 1;
count += 1;
this_deep += 1;
if(max_deep < this_deep)
max_deep = this_deep;
dfs(value,this_deep);
this_deep -= 1;
node = node->next;
}
else
node = node->next;
}
return 0;
}