你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的起點和終點房間,你首要目標是從起點盡快到達終點,在滿足首要目標的前提下,使得你的得分總和盡可能大。現在問題來了,給定房間、道路、分數、起點和終點等全部資訊,你能計算在盡快離開迷宮的前提下,你的最大得分是多少麼?
input
第一行4個整數n (<=500), m, start, end。n表示房間的個數,房間編號從0到(n - 1),m表示道路數,任意兩個房間之間最多只有一條道路,start和end表示起點和終點房間的編號。input示例第二行包含n個空格分隔的正整數(不超過600),表示進入每個房間你的得分。
再接下來m行,每行3個空格分隔的整數x, y, z (0output
一行,兩個空格分隔的整數,第乙個表示你最少需要的時間,第二個表示你在最少時間前提下可以獲得的最大得分。
3 2 0 2output示例1 2 3
0 1 10
1 2 11
21 6求最短路徑,不過加了乙個分數,在最短路徑上求最大分數。用dijistra演算法算最短路徑,不過在找相鄰最短路徑時,如果路徑相同,則取分數最大的點。
1 #include 2 #include 3 #include 4 #include5#define inf 0x3f3f3f3f
6using
namespace
std;
7const
int max = 550;8
intco[max], dist[max], g[max][max],low[max];
9int
n, m, s, e;
10bool
vis[max];
11void
dijistra()
15 memset(vis,0,sizeof
(vis));
16 memset(low,0,sizeof
(vis));
17 dist[s] = 0
;18 low[s] =co[s];
19for(int i = 1; i <= n; i ++)
27if(!vis[j] && dist[j] == mins && max 32if(mins == inf)break
;33 vis[pos] = true;34
for(int j = 1; j <= n; j ++)
39if(!vis[j] && low[j] < low[pos] + co[j] && dist[j] == dist[pos]+g[pos][j])42}
43}44}
45int
main()
51for(int i = 0; i < n; i ++) scanf("
%d",&co[i]);
52for(int i = 0; i < m; i ++) 58}
59dijistra();
60 printf("
%d %d\n
",dist[e],low[e]);
61return0;
62 }
51NOD1459 迷宮遊戲
1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...
51Nod 1459 迷宮遊戲
你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的起點和終點房間,你首要目標是從起點盡快到達終點,在滿足首要目標的前提下,使得你的得分總和盡可能大...
51NOD 1459 迷宮遊戲
1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...