2010 Stanford Local ACM Programming ContestH解题报告

题意是说,给出一些道路,要修建一条高速公路,高速公路不能分叉,而且是在给出的图中的一些路径组成,求的是不在高速公路上的点离高速公路的最远距离的最小值是多少。首先要找到一条这个图中的关键路径,既最长的路径,如果高速公路不是最长路径,那么没法满足其他的点到高速公路的距离最大值最小,而找最长路径,先从任意点找到离这个点最远的一个点,然后从最远的点找到一条最长的路径既为最长路径了。很有用的结论

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 }
原文地址:https://www.cnblogs.com/caozhenhai/p/2535182.html