题意是说,给出一些道路,要修建一条高速公路,高速公路不能分叉,而且是在给出的图中的一些路径组成,求的是不在高速公路上的点离高速公路的最远距离的最小值是多少。首先要找到一条这个图中的关键路径,既最长的路径,如果高速公路不是最长路径,那么没法满足其他的点到高速公路的距离最大值最小,而找最长路径,先从任意点找到离这个点最远的一个点,然后从最远的点找到一条最长的路径既为最长路径了。很有用的结论
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #define N 100005 4 #define inf 0x7fffffff 5 int head[N],t; 6 int used[N]; 7 int d[N]; 8 int par[N]; 9 int f,r; 10 struct node 11 { 12 int l; 13 int id; 14 }; 15 node q[N]; 16 struct edge 17 { 18 int v,next,l; 19 }; 20 edge e[2*N]; 21 void add(int u,int v,int l) 22 { 23 e[t].v=v; 24 e[t].l=l; 25 e[t].next=head[u]; 26 head[u]=t++; 27 } 28 void bfs() 29 { 30 int i,j; 31 node tmp; 32 while(f<r) 33 { 34 tmp=q[f]; 35 f++; 36 for(i=head[tmp.id];i>=0;i=e[i].next) 37 { 38 if(!used[e[i].v]) 39 { 40 used[e[i].v]=true; 41 par[e[i].v]=tmp.id; 42 d[e[i].v]=tmp.l+e[i].l; 43 q[r].id=e[i].v; 44 q[r++].l=d[e[i].v]; 45 } 46 } 47 } 48 } 49 int main() 50 { 51 int n,i,j,k; 52 int u,v,l; 53 node tmp; 54 while(scanf("%d",&n)&&n) 55 { 56 memset(head,-1,sizeof(head)); 57 t=0; 58 for(i=0;i<n-1;i++) 59 { 60 scanf("%d%d%d",&u,&v,&l); 61 add(u,v,l); 62 add(v,u,l); 63 } 64 memset(used,0,sizeof(used)); 65 d[1]=0; 66 used[1]=true; 67 f=r=0; 68 q[r].id=1; 69 q[r++].l=0; 70 bfs(); 71 int max=d[1],mi=1; 72 for(i=1;i<=n;i++) 73 { 74 if(d[i]>max) 75 { 76 max=d[i]; 77 mi=i; 78 } 79 } 80 int s=mi; 81 f=r=0; 82 q[r].id=s; 83 q[r++].l=0; 84 memset(used,0,sizeof(used)); 85 memset(par,0,sizeof(par)); 86 used[s]=true; 87 d[s]=0; 88 bfs(); 89 max=d[1],mi=1; 90 for(i=1;i<=n;i++) 91 { 92 if(d[i]>max) 93 { 94 max=d[i]; 95 mi=i; 96 } 97 } 98 k=mi; 99 f=r=0; 100 memset(used,0,sizeof(used)); 101 used[s]=true; 102 d[s]=0; 103 while(k) 104 { 105 used[k]=true; 106 q[r].id=k; 107 q[r++].l=0; 108 d[k]=0; 109 k=par[k]; 110 if(k==s) 111 break; 112 } 113 bfs(); 114 max=d[1]; 115 for(i=1;i<=n;i++) 116 { 117 if(d[i]>max) 118 { 119 max=d[i]; 120 } 121 } 122 printf("%d\n",max); 123 } 124 return 0; 125 }