题目大意:有N个村庄,有的村庄之间有一条通道连接,并规定,从一个村庄到达另一个村庄的通道不会经过除这两个村庄外的其他村庄,求经过通道,两个村庄之间的最长距离
解题思路:从一个村庄到达另一个村庄的通道不会经过除这两个村庄外的其他村庄,这就说明了,这些通道连接起来的村庄是不会构成环路的,所以这是一棵树,问题就转换成了求树的节点之间的最长距离
#include<cstdio>
#include<cstring>
#define maxn 20010
int v[maxn], head[maxn], next[maxn], w[maxn];
int e;
char temp[100];
long long res;
void add(int x, int y, int z) {
v[e] = y;
w[e] = z;
next[e] = head[x];
head[x] = e;
e++;
}
long long dfs(int cur, int fa) {
long long MAX = 0, ans;
for(int i = head[cur]; i != -1; i = next[i]) {
if(v[i] != fa) {
ans = dfs(v[i],cur) + w[i];
//经过cur这个点的最长距离
if(ans + MAX > res)
res = ans + MAX;
if(ans > MAX)
MAX = ans;
}
}
//返回一条路径最长的
return MAX;
}
int main() {
bool ok = true;
int x, y, z;
while(ok) {
memset(head,-1,sizeof(head));
e = 0;
while(1) {
if(gets(temp) == NULL) {
ok = false;
break;
}
if(temp[0] == '\0')
break;
sscanf(temp,"%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
res = 0;
dfs(1,-1);
printf("%lld\n",res);
}
return 0;
}