DFS更新每个点发出的边的最大值 和 以该点为中转点的两个子树中最长路径的和。
这题的输入好难控制啊- -
开始那种控制输入的写法总是超时。。。。。
搞了好久~
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 10010
using namespace std;
struct Edge
{
int v,w,next;
}e[maxn*maxn];
int head[maxn],cnt,id,ans;
char str[30];
void add(int x,int y,int z)
{
e[cnt].v = y;
e[cnt].w = z;
e[cnt].next = head[x];
head[x] = cnt++;
}
int dfs(int x,int fa)
{
int len = 0,lmax = 0;
for(int i=head[x];i!=-1;i=e[i].next)
{
int v = e[i].v;
if(v==fa) continue;
len = e[i].w+dfs(v,x);
ans = max(ans,lmax+len); //更新最长的边与当前边的和,ans记录以当前点x为中转点的两个子树中的最长路径和
lmax = max(len,lmax); //lmax记录每个节点发出的最长的边
}
return lmax;
}
int main()
{
int u,v,w;
bool ok = true;
while(ok)
{
memset(head,-1,sizeof(head));
cnt = 0;
while(1)
{
if(gets(str)==0)
{
ok = false;
break;
}
if(strlen(str)==0)
break;
else
{
sscanf(str,"%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
}
ans = 0;
dfs(1,-1);
printf("%d\n",ans);
}
return 0;
}