最短路 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

 

posted @ 2015-08-27 10:45  相儒以沫  阅读(178)  评论(0编辑  收藏  举报