UVA_10308
由于原图是一棵树,这样我们只要随便指定一个树根就可以画成树的形式,那么所有路径都可以看成以父节点为中转点的“儿子甲+儿子乙”的形式(当然只有一个儿子的处理方式也是一样的),同时我们用dfs遍历树的时候父节点顺便向上返回一个最大的儿子即可。
我在看UVA的论坛的时候,有人说是存在village数为0的情况,并且这种情况用一个空行表示,因此我们不能把所有的空行都当做分割线去处理,但实际上不考虑这种情况直接交也能AC,可能是后来UVA改了数据吧,不过我的程序还是按考虑有这种情况来写的。
#include<stdio.h>
#include<string.h>
#define MAXD 10010
#define MAXM 20010
char b[100];
int start, e, first[MAXD], next[MAXM], v[MAXM], w[MAXM];
long long int res;
void add(int x, int y, int z)
{
w[e] = z;
v[e] = y;
next[e] = first[x];
first[x] = e;
e ++;
}
long long int dfs(int u, int fa)
{
int i, j;
long long int max = 0, ans;
for(i = first[u]; i != -1; i = next[i])
if(v[i] != fa)
{
ans = dfs(v[i], u) + w[i];
if(ans + max > res)
res = ans + max;
if(ans > max)
max = ans;
}
return max;
}
void solve()
{
int i, j, k;
res = 0;
dfs(1, -1);
printf("%lld\n", res);
}
int main()
{
int x, y, z, ok = 1, blank = 1;
while(ok)
{
memset(first, -1, sizeof(first));
e = start = 0;
for(;;)
{
if(gets(b) == NULL)
{
ok = 0;
break;
}
if(b[0] == '\0')
{
if(blank)
{
if(gets(b) == NULL)
ok = 0;
}
blank = 1;
break;
}
else
blank = 0;
sscanf(b, "%d%d%d", &x, &y, &z);
start = x;
add(x, y, z);
add(y, x, z);
}
solve();
}
return 0;
}