1. 程式人生 > >迷宮遊戲(單源最短路)

迷宮遊戲(單源最短路)

style 個人 遊戲 stream cstring ace tin space for

個人心得:對於復雜抽象的算法還是比較模糊,希望以後有待加強。這題就是用dijskrual算法,在算出最短時間的時候進行適當的更改,還是比較模糊。

1459 迷宮遊戲技術分享 基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題 技術分享 收藏 技術分享 關註 你來到一個迷宮前。該迷宮由若幹個房間組成,每個房間都有一個得分,第一次進入這個房間,你就可以得到這個分數。還有若幹雙向道路連結這些房間,你沿著這些道路從一個房間走到另外一個房間需要一些時間。遊戲規定了你的起點和終點房間,你首要目標是從起點盡快到達終點,在滿足首要目標的前提下,使得你的得分總和盡可能大。現在問題來了,給定房間、道路、分數、起點和終點等全部信息,你能計算在盡快離開迷宮的前提下,你的最大得分是多少麽? Input
第一行4個整數n (<=500), m, start, end。n表示房間的個數,房間編號從0到(n - 1),m表示道路數,任意兩個房間之間最多只有一條道路,start和end表示起點和終點房間的編號。
第二行包含n個空格分隔的正整數(不超過600),表示進入每個房間你的得分。
再接下來m行,每行3個空格分隔的整數x, y, z (0<z<=200)表示道路,表示從房間x到房間y(雙向)的道路,註意,最多只有一條道路連結兩個房間, 你需要的時間為z。
輸入保證從start到end至少有一條路徑。
Output
一行,兩個空格分隔的整數,第一個表示你最少需要的時間,第二個表示你在最少時間前提下可以獲得的最大得分。
Input示例
3 2 0 2
1 2 3
0 1 10
1 2 11
Output示例
21 6
 1 #include<iostream>
 2 #include<cstring>
 3 #include<vector>
 4 #include<cstdio>
 5 #include<queue>
 6 #include<algorithm>
 7 using namespace std;
 8 const
int inf = 0x3f3f3f3f; 9 int n,m,start,send; 10 int a[505]; 11 int ans[505]; 12 int d[505],book[505]; 13 struct node 14 { 15 int v,s; 16 node(int x,int y):v(x),s(y){} 17 bool operator <(const node&r)const{ 18 return r.s<s; 19 } 20 }; 21 struct edge
22 { 23 int v,w; 24 edge(int x,int y):v(x),w(y){} 25 }; 26 vector <edge>E[505]; 27 void getedge(int x,int y,int z){ 28 E[x].push_back(edge(y,z)); 29 } 30 void dij() 31 { 32 priority_queue<node>q; 33 for(int i=0;i<n;i++){ 34 d[i]=inf; 35 book[i]=0; 36 ans[i]=0; 37 } 38 d[start]=0; 39 ans[start]=a[start]; 40 q.push(node(start,0)); 41 while(!q.empty()) 42 { 43 node t=q.top();q.pop(); 44 int u=t.v; 45 if(book[u]) 46 continue; 47 book[u]=1; 48 for(int i=0;i<E[u].size();i++) 49 { 50 int v=E[u][i].v; 51 int w=E[u][i].w; 52 if(!book[v]&&d[u]+w<d[v]){ 53 d[v]=d[u]+w; 54 ans[v]=ans[u]+a[v]; 55 q.push(node(v,d[v])); 56 } 57 else if(!book[v]&&d[u]+w==d[v]) 58 ans[v]=max(ans[v],ans[u]+a[v]); 59 } 60 } 61 62 } 63 int main() 64 { 65 scanf("%d%d%d%d",&n,&m,&start,&send); 66 for(int i=0;i<n;i++) 67 scanf("%d",&a[i]); 68 while(m--){ 69 70 int x,y,z; 71 scanf("%d%d%d",&x,&y,&z); 72 getedge(x,y,z); 73 getedge(y,x,z); 74 } 75 dij(); 76 printf("%d %d\n",d[send],ans[send]); 77 return 0; 78 79 }



迷宮遊戲(單源最短路)