POJ1985
题解:
-
求树中最长路。从任意点出发BFS找最远的点,再从最远的那个点BFS找最远的点便是直径。
代码:
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int const N = 50000 + 10;
int n,m,last,num;
int dis[N];
struct Edge
{
int u,dist;
Edge(int a,int b):u(a),dist(b){}
};
vector<Edge>G[N];
int BFS(int u){
queue<Edge>q;
q.push(Edge(u,0));
memset(dis,-1,sizeof(dis));
dis[u] = last = 0;
num = 1;
while(!q.empty()){
Edge p = q.front(); q.pop();
int x = p.u;
for(int i=0;i<G[x].size();i++){
Edge e = G[x][i];
int y = e.u;
if(dis[y] == -1){
dis[y] = max(dis[y],dis[x] + e.dist);
if(dis[y] > last)
last = dis[y], num = y;
q.push(Edge(y,e.dist));
}
}
}
return last;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int u,v,d;
char t;
scanf("%d%d%d %c",&u,&v,&d,&t);
G[u].push_back(Edge(v,d));
G[v].push_back(Edge(u,d));
}
BFS(1);
printf("%d\n",BFS(num));
}