zoukankan      html  css  js  c++  java
  • 最短路 POJ2267

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <map>
     4 #include <cstring>
     5 
     6 using namespace std;
     7 
     8 struct edge
     9 {
    10     int fro,to,val;
    11 }e[30000];
    12 int ednum=0;
    13 int div[3000];
    14 int MAX=1<<29;
    15 map<string ,int>mp;
    16 
    17 void addEdge(int _fro,int _to,int _val)
    18 {
    19     e[ednum].fro=_fro;
    20     e[ednum].to=_to;
    21     e[ednum].val=_val;
    22     ednum++;
    23 }
    24 
    25 int main()
    26 {
    27     int T;
    28     scanf("%d",&T);
    29     for(int l=1;l<=T;l++)
    30     {
    31         int n;
    32         scanf("%d",&n);
    33         mp.clear();
    34         string a,b;
    35         int c,d;
    36         int num=0;
    37         ednum=0;
    38         for(int i=1;i<=n;i++)
    39         {
    40             cin>>a>>b>>c>>d;
    41             if(mp.find(a)==mp.end())
    42             {
    43                 mp[a]=num;
    44                 num++;
    45             }
    46             if(mp.find(b)==mp.end())
    47             {
    48                 mp[b]=num;
    49                 num++;
    50             }
    51             c=(c+6)%24;
    52             int tmp=(d+c)%24;
    53             if((c>12&&c<24)||(tmp>12&&tmp<24)||(d>12))
    54                 continue;
    55             addEdge(mp[a]*24+c,mp[b]*24+tmp,0);
    56         }
    57         string start,en;
    58         cin>>start>>en;
    59         for(int i=0;i<num;i++)
    60         {
    61             for(int j=0;j<24;j++)
    62             {
    63                 if(j!=17)
    64                     addEdge(i*24+j,i*24+((j+1)%24),0);
    65                 else
    66                     addEdge(i*24+j,i*24+((j+1)%24),1);
    67             }
    68         }
    69         for(int i=0;i<num*24;i++)
    70         {
    71             div[i]=MAX;
    72         }
    73         div[mp[start]*24]=0;
    74         for(int i=0;i<num*24;i++)
    75         {
    76             for(int j=0;j<ednum;j++)
    77             {
    78 
    79                 if(div[e[j].to]>div[e[j].fro]+e[j].val)
    80                     div[e[j].to]=div[e[j].fro]+e[j].val;
    81             }
    82         }
    83         int mi=MAX;
    84         for(int i=0;i<23;i++)
    85         {
    86             if(div[mp[en]*24+i]<mi)
    87                 mi=div[mp[en]*24+i];
    88         }
    89         cout<<"Test Case "<<l<<"."<<endl;
    90         if(mi>=MAX)
    91             cout<<"There is no route Vladimir can take."<<endl;
    92         else
    93             cout<<"Vladimir needs "<<mi<<" litre(s) of blood."<<endl;
    94     }
    95     return 0;
    96 }
    View Code
  • 相关阅读:
    经典分水岭算法的 C++ 实现
    一个简易的键盘按键测试程序
    工程优化方法中的“最速下降法”和“DFP拟牛顿法”的 C 语言实现
    基于哈夫曼编码的压缩解压程序(C 语言)
    博客选择:博客园 or CSDN
    Spring总结
    CSS总结
    EL表达式总结
    Jdbc总结
    hibernate总结
  • 原文地址:https://www.cnblogs.com/wsruning/p/4762612.html
Copyright © 2011-2022 走看看