1. 程式人生 > >ZOJ 2750 -- Idiomatic Phrases Game(Dijkstra)

ZOJ 2750 -- Idiomatic Phrases Game(Dijkstra)

權重 ons 鄰接 ont 運用 mes png node else

ZOJ 2750 -- Idiomatic Phrases Game(Dijkstra)

題意 :

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

思路 :

將所有的成語看成一個點,如果找到下一個成語,就建一條有向邊,然後用dijkstra求最短路。

技術分享圖片

 1 #include<iostream>
 2 #include<cstring>
 3 using
namespace std; 4 const int maxn = 1000+5;///N (0 < N < 1000) 5 const int INF = 1000000000;//無窮大 6 struct node{ 7 char front[5],back[5];///front[4]和back[4]用來存放結束符‘\0‘ 8 int T;///用來存放邊的權重,從這個成語到其他成語所需的時間 9 }; 10 int Edge[maxn][maxn];//鄰接矩陣 11 int dist[maxn];//用來存儲原點到i結點的最短路徑 12 int S[maxn]; 13 int n;///字典中成語的數量 14
node dic[maxn]; 15 16 void solve_case(int v0) 17 { 18 ///建圖 19 for(int i=0;i<n;i++) 20 { 21 for(int j=0;j<n;j++) 22 {//判斷從i->j是否有單向路徑 23 Edge[i][j] = INF; 24 if(i==j) continue; 25 if(strcmp(dic[i].back,dic[j].front) == 0){ 26 Edge[i][j] = dic[i].T;
27 } 28 } 29 } 30 31 ///Dijkstra算法 32 for(int i=0;i<n;i++) //初始化 33 { 34 dist[i] = Edge[v0][i];S[i] = 0; 35 } 36 dist[v0] = 0;S[v0] = 1;///將源點加入S 37 38 for(int i=0;i<n-1;i++)///尋找n-1條最短路 39 { 40 int min = INF,u=0; 41 for(int j=0;j<n;j++)///尋找一個具有最短路的結點u 42 { 43 if(!S[j] && dist[j]<min) 44 { 45 min = dist[j];u = j; 46 } 47 } 48 S[u] = 1; 49 ///更新與結點u能到達的點 50 for(int j=0;j<n;j++) 51 { 52 if(Edge[u][j]<INF && dist[u]+Edge[u][j]<dist[j]){ 53 dist[j] = dist[u] + Edge[u][j]; 54 } 55 } 56 } 57 if(dist[n-1]==INF) cout<<-1<<endl; 58 else cout<<dist[n-1]<<endl; 59 } 60 61 int cin_case() 62 { 63 while(cin>>n && n) 64 { 65 char arr[100]; 66 for(int i=0;i<n;i++) 67 { 68 cin>>dic[i].T>>arr; 69 int len = strlen(arr); 70 for(int j=0,k=len-1;j<4;j++,k--) 71 {///將讀入的成語的第一個和第二個漢字存入字典 72 dic[i].front[j] = arr[j]; 73 dic[i].back[3-j] = arr[k]; 74 } 75 //////////一定要註意加字符結束符/////////// 76 dic[i].front[4] = dic[i].back[4] = \0; 77 /////////////////////////////////////////// 78 } 79 return 1; 80 } 81 return 0; 82 } 83 84 int main() 85 { 86 while(cin_case()) 87 { 88 solve_case(0); 89 } 90 91 return 0; 92 }

技術分享圖片

ZOJ 2750 -- Idiomatic Phrases Game(Dijkstra)