题意:给出一些村庄之间的路的距离,每个村庄可以到达任意其他村庄,且所有路中不会有环。问任意两个村庄可达的总路径最长是多少。
题解:因为从一个村庄到另一个村庄同一个的村庄不会经过两次,所以村庄和路其实是一棵无根树,用dfs(int a)计算结点a的子结点到a的最大距离,结果就是a的子结点到结点a的最大距离加次大距离。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 10005;
char str[30];
int vis[ N];
int cnt, head[N], res;
struct Edge {
int u, v, l, next;
}e[N];
int dfs(int cur) {
int temp = 0;
vis[cur] = 1;
for (int i = head[cur]; i != -1; i = e[i].next) {
if (!vis[e[i].v]) {
int dd = dfs(e[i].v) + e[i].l;
res = max(res, temp + dd);
temp = max(temp, dd);
}
}
return temp;
}
void add(int u, int v, int l) {
e[cnt].u = u;
e[cnt].v = v;
e[cnt].l = l;
e[cnt].next = head[u];
head[u] = cnt++;
e[cnt].u = v;
e[cnt].v = u;
e[cnt].l = l;
e[cnt].next = head[v];
head[v] = cnt++;
}
int main() {
while (1) {
int a, b, c;
memset(head, -1, sizeof(head));
memset(vis, 0, sizeof(vis));
res = 0;
cnt = 0;
while (gets(str) != NULL && str[0] != '\0') {
sscanf(str, "%d%d%d", &a, &b, &c);
add(a, b, c);
}
dfs(a);
printf("%d\n", res);
if (str[0] != '\0')
break;
}
return 0;
}