链接:http://poj.org/problem?id=1985
题意:题目阐述不是很清楚,是一棵严格树,不存在环,求其中两点间距离最长一处。
思路:两点间距离最长即为树的直径。易得,从任意点开始DFS找到距离最长一点一定是距离最长两点之一,再从找到的点再DFS一次就可以找到数的直径。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<ctype.h> #include<algorithm> #include<string> #define PI acos(-1.0) #define maxn 50005 #define maxm 100005 #define INF 1<<25 #define MAX 0x7fffffff typedef long long ll; using namespace std; struct Edge { int v,w; int next; }edge[maxm]; int tot,tt; int point[maxn]; int vv[maxn],dis[maxn]; int top=1,d; int init() { top=1; memset(edge,0,sizeof(edge)); memset(point,0,sizeof(point)); memset(vv,0,sizeof(vv)); memset(dis,0,sizeof(dis)); d=0; } int add_edge(int u,int v,int w) { edge[top].v=v; edge[top].w=w; edge[top].next=point[u]; point[u]=top++; edge[top].v=u; edge[top].w=w; edge[top].next=point[v]; point[v]=top++; return 0; } int dfs(int x) { vv[x]=1; for(int i=point[x];i!=0;i=edge[i].next) { if(!vv[edge[i].v]) { d+=edge[i].w; dis[edge[i].v]=d; dfs(edge[i].v); d-=edge[i].w; } } } int main() { scanf("%d%d",&tot,&tt); init(); for(int i=0;i<tt;i++) { int x,y,z; char ss[3]; scanf("%d%d%d%s",&x,&y,&z,ss); add_edge(x,y,z); } dfs(1); int aa=0,bb; for(int i=1;i<=tot;i++) { if(dis[i]>aa) { bb=i; aa=dis[i]; } } memset(dis,0,sizeof(dis)); memset(vv,0,sizeof(vv)); dfs(bb); aa=0; d=0; for(int i=1;i<=tot;i++) { if(dis[i]>aa) { bb=i; aa=dis[i]; } } printf("%d\n",aa); }
原文:http://blog.csdn.net/ooooooooe/article/details/19260257