这题做了好久,一开始的时候按照网上别人的思路写,结果超时。
因此,纠结了好久。
今天,发现他居然遍历了4次,时间复杂度是4 * O(n)。 囧。
这题,可以广搜搞定,不过写了那么多超时的深搜,我还是用深搜。
#include <iostream>
using namespace std;
#define MAXN 100100
#define Min(a,b) ((a)<(b)?(a):(b))
struct Graph {
int vex, next;
} G[MAXN << 1]; //边存了两遍。
int first[MAXN], mn, md;
bool flag[MAXN];
void DFS(int pos, int dep) {
int tot;
flag[pos] = true;
if (dep >= md) {
if (dep > md) {
md = dep;
mn = pos;
} else if (pos < mn) {
mn = pos;
}
}
for (tot = first[pos]; tot != -1; tot = G[tot].next) {
if (!flag[G[tot].vex]) {
DFS(G[tot].vex, dep + 1);
}
}
}
int main() {
int n, i, tot, s, e, a;
while (scanf("%d", &n) != EOF) {
memset(first, -1, sizeof(first));
tot = 0;
for (i = 1; i < n; i++) {
scanf("%d %d", &s, &e);
G[tot].vex = e;
G[tot].next = first[s];
first[s] = tot++;
G[tot].vex = s;
G[tot].next = first[e];
first[e] = tot++;
}
memset(flag, false, sizeof(flag));
mn = md = -1;
DFS(1, 0);
a = mn;
memset(flag, false, sizeof(flag));
mn = md = -1;
DFS(a, 0);
printf("%d %d\n", Min(a,mn), md + 1);
}
return 0;
}