• 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 }
  • 相关阅读:
    对于函数中多个返回值的处理
    Docker-compose 安裝单机版redis
    设计模式七大设计原则
    UML 设计技巧
    使用Docker 容器配置nexus3.29 私有仓库
    分布式消息Kafka通信原理分析
    分布式消息Kafka通信
    使用docker 搭建nexus3.29
    分布式消息Kafka初步认识及基本应用
    Dubbo 常用配置及源码分析
  • 原文地址:https://www.cnblogs.com/caozhenhai/p/2535182.html
Copyright © 2020-2023  润新知