poj2631
题意就是求树的直径…树的直径的求法就是两边dfs或者两边bfs吧【捂脸】…感觉两个速度一样诶【捂脸】
证明就是反证法,网上好多人都有证明..这里就不证了..可以看这里【捂脸】
做法就是第一次求出一个端点..然后再从这个端点找最长的路径…
dfs
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
#define N 11000
struct node{int x,y,z,next;}edge[2*N];
int d[N],vis[N],h[N],max1,pos,num=0;
void insert(int x,int y,int z){
edge[++num].x=x;edge[num].y=y;edge[num].z=z;edge[num].next=h[x];h[x]=num;
edge[++num].x=y;edge[num].y=x;edge[num].z=z;edge[num].next=h[y];h[y]=num;
}
void dfs(int x){
for(int i=h[x];i;i=edge[i].next){
int y=edge[i].y;
if(vis[y]) continue;
d[y]=d[x]+edge[i].z;vis[y]=1;dfs(y);
if(d[y]>max1) max1=d[y],pos=y;
}
}
int main(){
int x,y,z;while(scanf("%d%d%d",&x,&y,&z)>0) insert(x,y,z);
memset(d,0,sizeof(d));memset(vis,0,sizeof(vis));vis[1]=1;max1=0;dfs(1);
memset(d,0,sizeof(d));memset(vis,0,sizeof(vis));vis[pos]=1;max1=0;dfs(pos);
printf("%d\n",max1);
return 0;
}
bfs
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
#define N 11000
struct node{int x,y,z,next;}edge[2*N];
int d[N],vis[N],h[N],max1,pos,num=0;
void insert(int x,int y,int z){
edge[++num].x=x;edge[num].y=y;edge[num].z=z;edge[num].next=h[x];h[x]=num;
edge[++num].x=y;edge[num].y=x;edge[num].z=z;edge[num].next=h[y];h[y]=num;
}
void bfs(int x){
memset(d,0,sizeof(d));max1=0;pos=x;
memset(vis,0,sizeof(vis));vis[x]=1;
queue<int>q;q.push(x);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=h[u];i;i=edge[i].next){
int v=edge[i].y;if(vis[v]) continue;
d[v]=d[u]+edge[i].z;vis[v]=1;q.push(v);
if(d[v]>max1) pos=v,max1=d[v];
}
}
}
int main(){
int x,y,z;while(scanf("%d%d%d",&x,&y,&z)>0) insert(x,y,z);
bfs(1);bfs(pos);
printf("%d\n",max1);
return 0;
}