题意:连通无环图是一个树,且图中任意一个结点都可以看作是树的根结点,以不同的结点为根结点,树的高度可能不同,要求输出层数最大的树的根节点编号。
思路:从各个结点开始分别用DFS遍历一次,记录最长的路径值,这个值就是以这个结点为根的树的高度。刚开始用邻接矩阵存储图,内层爆了。
总结:结点数小于等于1000可以用邻接矩阵,本题结点数小于等于10000,使用邻接链表做。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
bool visited[10001];
int maxdis;
int list[10001]; //存储以每个结点为根的树的高度
vector<int> edges[10001];
void dfs(int x, int cnt)
{
visited[x] = true;
int next;
for(int i = 0; i < edges[x].size(); i++)
{
next = edges[x][i];
if(!visited[next])
dfs(next, cnt+1);
}
//下面的语句可以记录最长的路径
if(cnt > maxdis)
maxdis = cnt;
}
int main()
{
int n, a, b;
cin >> n;
for(int i = 1; i <= n; i++)
edges[i].clear();
for(int i = 0; i < n-1; i++)
{
cin >> a >> b;
edges[a].push_back(b);
edges[b].push_back(a);
}
int compnents = 0;
memset(visited, 0, sizeof(visited));
for(int i = 1; i <= n; i++)
if(!visited[i])
{
dfs(i, 1);
compnents++;
}
if(compnents != 1)
{
cout << "Error: "<< compnents << " components" << endl;
return 0;
}
bool flag = false;
int max = 0;
for(int i = 1; i <= n; i++)
{
memset(visited, 0, sizeof(visited));
maxdis = 1;
dfs(i, 1);
list[i] = maxdis;
if(max < maxdis)
max = maxdis;
}
for(int i = 1; i <= n; i++)
if(list[i] == max)
cout << i << endl;
return 0;
}