33,008
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
int data;
struct node *next;
}Node, *Ver;//节点
typedef struct
{
int v, e;
Ver *s;//头结点数组
}Graph;//邻接表表示图
typedef struct
{
int num;
int data;
}Deep;
int visit[MAX];
Deep deep[MAX];
void Init(Graph *G)//初始化图
{
int i;
int s, e;
Node *temp;
scanf("%d", &G->v);
G->e = G->v - 1;
G->s = (Ver *)malloc(sizeof(Ver) * G->v);
for (i = 0; i < G->v; i++)
{
G->s[i] = (Node *)malloc(sizeof(Node));
G->s[i]->next = NULL;
G->s[i]->data = 0;
}
for (i = 0; i < G->e; i++)//无向图
{
scanf("%d%d", &s, &e);
s -= 1;
e -= 1;
temp = (Node *)malloc(sizeof(Node));
temp->data = e;
temp->next = G->s[s]->next;
G->s[s]->next = temp;
temp = (Node *)malloc(sizeof(Node));
temp->data = s;
temp->next = G->s[e]->next;
G->s[e]->next = temp;
}
}
int cmp(const void *a, const void *b)//快排的cmp
{
Deep *c = (Deep *)a;
Deep *d = (Deep *)b;
if (c->data != d->data)//按照高度降序
return d->data - c->data;
else //如果高度想同,那么按照序号升序
return c->num - d->num;
}
void Clear(int len)//清空visit
{
memset(visit, 0, sizeof(int) * (len + 1));
}
void DFS(Graph G, int start, int *high)//深度搜索
{
int v;
int flag = 0;
Node *temp;
visit[start] = 1;
temp = G.s[start]->next;
while (temp)
{
v = temp->data;
if (!visit[v])
{
if (flag == 0)
{
*high += 1;
flag = 1;//已到过该层
}
DFS(G, v, high);
}
temp = temp->next;
}
}
void DFSVisit(Graph G)
{
int i, j = 0;
int high = 1, count = 0;
int max;
Clear(G.v);
for (i = 0; i < G.v; i++)//判断是否强连通
if (!visit[i])
{
DFS(G, i, &high);
count++;
}
if (count > 1)
printf("Error: %d components\n", count);
else //强连通
{
for (i = 0; i < G.v; i++)//逐个找出每个节点的deepest tree high
{
Clear(G.v);
high = 1;
DFS(G, i, &high);
deep[j].num = i + 1;
deep[j++].data = high;
}
qsort(deep, j, sizeof(Deep), cmp);//排序
max = deep[0].data;
for (i = 0; i < j && deep[i].data == max; i++)//输出节点
{
printf("%d\n", deep[i].num);
}
}
}
int main()
{
Graph G;
Init(&G);
DFSVisit(G);
return 0;
}
#include <iostream>
#include <string>
#include <algorithm>
#include <memory.h>
#include <cstdio>
#include <cstdlib>
#include <set>
#include <vector>
#include <queue>
using namespace std;
#define MAX 0Xfffffff
int dis[10001];
int n;
vector<int> map[10001];//邻接表
int father[10001];
int visit[10001];
vector<int> ans;
int getfather(int i){
if(i==father[i])
return i;
return father[i] = getfather(father[i]);
}
void unionmerge(int i, int j){
father[i] = j;
}
int bfs(int x){
queue<int> q;
memset(visit, 0, sizeof(visit));
visit[x] = 1;
int maxv = 0;
q.push(x);
while(!q.empty()){
int v = q.front();
q.pop();
if(dis[v]>maxv)
maxv = dis[v];
for(int i=0;i<map[v].size();++i)
if(!visit[map[v][i]]){
visit[map[v][i]] = 1;
dis[map[v][i]] = dis[v] + 1;
q.push(map[v][i]);
}
}
return maxv;
}
int main(){
//freopen("in.txt", "r", stdin);
int a, b;
cin>>n;
for(int i=1;i<=n;++i)
father[i] = i;
for(int i=0;i<n-1;++i){
scanf("%d%d", &a, &b);
map[a].push_back(b);
map[b].push_back(a);
unionmerge(getfather(a), getfather(b)); //getfather合并
}
set<int> ss;
for(int i=1;i<=n;++i){
int f = getfather(i);
if(ss.count(f)<=0){
ss.insert(f);
}
}
if(ss.size()!=1){
printf("Error: %d components\n", ss.size());
}else{
int maxv = bfs(1);
for(int i=1;i<=n;++i){
if(dis[i]==maxv)
ans.push_back(i);
}
maxv = bfs(ans[0]);
for(int i=1;i<=n;++i){
if(dis[i]==maxv)
ans.push_back(i);
}
sort(ans.begin(), ans.end());
printf("%d\n", ans[0]);
//去掉重复的
for(int i=1;i<ans.size();++i)
if(ans[i]!=ans[i-1])
printf("%d\n", ans[i]);
}
//fclose(stdin);
}