1. 程式人生 > >ZOJ-2750 Idiomatic Phrases Game---Dijk最短路

ZOJ-2750 Idiomatic Phrases Game---Dijk最短路

必須 .html 字符 case algorithm ble logs == col

題目鏈接:

https://vjudge.net/problem/ZOJ-2750

題目大意:

給定一本字典,字典裏有很多成語,要求從字典裏的第一個成語開始,運用字典裏的成語變到最後一個成語,變得過程就是成語接龍,後一個成語的第一個字必須有前一個成語的最後一個字相等,給定的成語是4位16進制數字,每個成語前邊跟的數字代表著找到這個成語之後再找到下個成語還需要t分鐘 。(這裏是找到該成語後還需要時間t,才能找到下一個成語)

思路:

每個成語有前面四個字符和後面四個字符,如果第i個成語後面字符等於第j個成語前面四個字符,那麽這中間的消耗就是第i個成語自帶的消耗T,按照這個原理就可以建圖啦。然後用dijkstra

求出從第一個成語到其他各個成語的最短路,然後判斷最後一個成語是否可達,可達就輸出d[n],不能就輸出-1

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<queue>
 7 #include<stack>
 8 #include<map>
 9 #include<sstream>
10 using namespace
std; 11 typedef long long ll; 12 const int maxn = 1000 + 10; 13 const int INF = 1 << 25; 14 int T, n, m, cases; 15 int Map[maxn][maxn]; 16 bool v[maxn]; 17 int d[maxn]; 18 void dijkstra(int u0) 19 { 20 memset(v, 0, sizeof(v)); 21 for(int i = 1; i <= n; i++)d[i] = (i == u0 ? 0 : INF); 22 for
(int i = 1; i <= n; i++) 23 { 24 int x, m = INF; 25 for(int j = 1; j <= n; j++)if(!v[j] && d[j] <= m)m = d[x = j]; 26 v[x] = 1; 27 for(int j = 1; j <= n; j++) 28 d[j] = min(d[j], d[x] + Map[x][j]);//松弛操作 29 } 30 } 31 struct node 32 { 33 string s1, s2; 34 int time; 35 }; 36 node a[maxn]; 37 int main() 38 { 39 while(cin >> n && n) 40 { 41 string s; 42 int x; 43 for(int i = 1; i <= n; i++) 44 { 45 cin >> x >> s; 46 a[i].time = x; 47 a[i].s1 = a[i].s2 = ""; 48 for(int j = 0, k = s.size() - 4; j < 4; j++, k++) 49 { 50 a[i].s1 += s[j]; 51 a[i].s2 += s[k]; 52 } 53 //cout<<a[i].s1<<" "<<a[i].s2<<endl; 54 } 55 for(int i = 1; i <= n; i++)//建圖 56 { 57 for(int j = 1; j <= n; j++) 58 { 59 Map[i][j] = INF; 60 if(i == j)continue; 61 if(a[i].s2 == a[j].s1)Map[i][j] = a[i].time; 62 } 63 } 64 dijkstra(1); 65 if(d[n] >= INF)cout<<"-1"<<endl; 66 else cout<<d[n]<<endl; 67 } 68 return 0; 69 }

ZOJ-2750 Idiomatic Phrases Game---Dijk最短路