zoukankan      html  css  js  c++  java
  • Airport Express UVA

    Airport Express

     UVA - 11374

    题意:n个点,有m条普通路径,k条高速路径,但是k条只能选一条走。问从s到e最短时间。

    如果选a-->b这条高速,那么s-->a和b--->e必然也要是最短路。

    于是我们可以先用两次dijkstra预处理出s到各点的最短路和e到各点的最短路,然后枚举k条高速走哪条。

    输出路径的时候,可以递归~

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 const int inf=0x3f3f3f3f;
      4 const int maxv=1010;
      5 const int maxe=1010;
      6 
      7 struct Edge
      8 {
      9     int u,v,w;
     10     int nex;
     11 }e[maxe<<1];
     12 int head[maxv];
     13 int cnt=0;
     14 void init()
     15 {
     16     memset(head,-1,sizeof(head));
     17     cnt=0;
     18 }
     19 void add(int u,int v,int w)
     20 {
     21     e[cnt].u=u;
     22     e[cnt].v=v;
     23     e[cnt].w=w;
     24     e[cnt].nex=head[u];
     25     head[u]=cnt++;
     26 }
     27 
     28 typedef pair<int,int> PII;
     29 int dis[maxv];
     30 int par[maxv];
     31 void dijkstra(int s)
     32 {
     33     priority_queue<PII,vector<PII>,greater<PII> > pq;
     34     for(int i=0;i<maxv;i++) dis[i]=inf;
     35     dis[s]=0;
     36     pq.push(PII(0,s));
     37     while(!pq.empty())
     38     {
     39         PII temp=pq.top();
     40         pq.pop();
     41         int u=temp.second;
     42         if(dis[u]<temp.first) continue;
     43         for(int i=head[u];i!=-1;i=e[i].nex)
     44         {
     45             if(dis[e[i].v]>dis[u]+e[i].w)
     46             {
     47                 dis[e[i].v]=dis[u]+e[i].w;
     48                 par[e[i].v]=i;
     49                 pq.push(PII(dis[e[i].v],e[i].v));
     50             }
     51         }
     52     }
     53 }
     54 int n,ss,ee;
     55 int ds[maxv],de[maxv];
     56 int p[maxv],p1[maxv];
     57 
     58 void print(int a)
     59 {
     60     if(a==ss)
     61     {
     62         printf("%d",a+1);
     63     }
     64     else
     65     {
     66         int x=p1[a];
     67         print(e[x].u);
     68         printf(" %d",a+1);
     69     }
     70     return ;
     71 }
     72 
     73 int main()
     74 {
     75     int kase=0;
     76 
     77     while(scanf("%d%d%d",&n,&ss,&ee)!=EOF&&n)
     78     {
     79         if(kase++) puts("");
     80         ss--;ee--;
     81         init();
     82         int u,v,w;
     83         int m;
     84         scanf("%d",&m);
     85         for(int i=0;i<m;i++)
     86         {
     87             scanf("%d%d%d",&u,&v,&w);
     88             u--,v--;
     89             add(u,v,w);
     90             add(v,u,w);
     91         }
     92         dijkstra(ss);
     93         for(int i=0;i<n;i++) {ds[i]=dis[i];p1[i]=par[i];}
     94         pa[ss]=-1;
     95         dijkstra(ee);
     96         for(int i=0;i<n;i++) {de[i]=dis[i];p[i]=par[i];}
     97         p[ee]=-1;
     98 
     99 
    100         int ans1=ds[ee];
    101         int a=-1,b=-1;
    102         int k;
    103         scanf("%d",&k);
    104         for(int i=0;i<k;i++)
    105         {
    106             scanf("%d%d%d",&u,&v,&w);
    107             u--;v--;
    108             if(ans1>ds[u]+w+de[v])
    109             {
    110                 ans1=ds[u]+w+de[v];
    111                 a=u,b=v;
    112             }
    113             if(ans1>ds[v]+w+de[u])
    114             {
    115                 ans1=ds[v]+w+de[u];
    116                 a=v,b=u;
    117             }
    118         }
    119 
    120         int flag=0;
    121         if(a==-1)
    122         {
    123             int x=ss;
    124             while(x!=ee)
    125             {
    126                 if(!flag){printf("%d",x+1);flag=1;}
    127                 else printf(" %d",x+1);
    128                 x=e[p[x]].u;
    129             }
    130             printf(" %d
    ",ee+1);
    131             printf("Ticket Not Used
    %d
    ",ans1);
    132         }
    133         else
    134         {
    135             print(a);
    136             int x=b;
    137             while(x!=ee)
    138             {
    139                 printf(" %d",x+1);
    140                 x=e[p[x]].u;
    141             }
    142             printf(" %d
    ",ee+1);
    143             printf("%d
    %d
    ",a+1,ans1);
    144         }
    145     }
    146     return 0;
    147 }
    View Code
  • 相关阅读:
    Ubuntu 或 UbuntuKyLin14.04 Unity桌面側边栏和顶层菜单条显示异常解决方法
    关于程序猿的几个阶段!
    独立开发人员低成本推广APP的18条技巧
    Effective C++ 条款27
    OpensStack instance debug
    OpenStackCLI调试及术语识记
    OpenStack术语名词及问题调试
    apacheOfbiz
    obiz
    How to run OFBiz as a Service on linux
  • 原文地址:https://www.cnblogs.com/yijiull/p/7435574.html
Copyright © 2011-2022 走看看