poj 2631 poj 1985 树的直径 树的最长链
假设最长链是s-t,
任意从一个点开始搜索,能搜到的最远的点肯定是s、t中的一个,然后再从搜到的最远点搜一遍,从这个店到能搜到的最远的点的路径就是最长链
详细证明改天再写
View Code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int head[maxn];
struct Edge{
int v,w,next;
}edge[maxn*2];
bool vis[maxn];
int dis[maxn];
int n,m;
int E;
void add(int u,int v,int w)
{
edge[E].v=v;
edge[E].w=w;
edge[E].next=head[u];
head[u]=E++;
}
void dfs(int u,int len)
{
int i;
if(dis[u]<len) dis[u]=len;
vis[u]=true;
for(i=head[u];i!=-1;i=edge[i].next)
{
if(!vis[edge[i].v])
dfs(edge[i].v,len+edge[i].w);
}
}
int main()
{
int i,j,len,w,st;
char dir[10];
E=0;
memset(head,-1,sizeof(head));
n=0;
while(scanf("%d%d%d",&i,&j,&w)!=EOF)
{
if(n<i) n=i;
if(n<j) n=j;
add(i,j,w);
add(j,i,w);
}
if(n==0)
{
puts("0");
}
else{
dfs(1,0);
for(i=1,len=-1;i<=n;i++)
if(dis[i]>len)
{
len=dis[i];
st=i;
}
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
dfs(st,0);
for(i=1,len=-1;i<=n;i++)
if(dis[i]>len)
len=dis[i];
printf("%d\n",len);
}
return 0;
}