1459 迷宮遊戲
基準時間限制:1 秒 空間限制:131072 kb 分值: 0
難度:基礎題
你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的起點和終點房間,你首要目標是從起點盡快到達終點,在滿足首要目標的前提下,使得你的得分總和盡可能大。現在問題來了,給定房間、道路、分數、起點和終點等全部資訊,你能計算在盡快離開迷宮的前提下,你的最大得分是多少麼?
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當時想題的方向對了,單源最短路,但乙個誤區是覺得最大得分和最小時間不能分開求必須記錄路徑,覺得分開求的得分會岔開,反正思維有點混亂,後來想想即便是通過乙個點鬆弛了,只是加不加這個點的問題,之前的最小時間的得分已經被記錄好了,是完整的,不會被岔開;還有,還覺得相同的時間肯定是加上乙個點得分最大,其實不是的
相同的時間,下面的路徑雖然比上面的路徑多了乙個點,但是之前的得分已經差很大了。
想到了要開乙個陣列記錄一下被鬆弛後的得分。
當時加上了以下紅色部分的**,樣例得分結果一直是11,一直debug,後來發現綠色部分的**,若j與u相同,時間加上0,與之前時間相同,但得分卻會多加上一部分。
#include
#include
#include
#define inf 0x3f3f3f
using namespace std;
int e[510][510];
int s[510],book[510];
int dist[510],p[510];
int n,m,start,end;
int main()
memset(p,0,sizeof(p));
memset(book,0,sizeof(book));
scanf("%d %d %d %d",&n,&m,&start,&end);
for(int i=0;iscanf("%d",&s[i]);
for(int i=1;i<=m;i++)
for(int i=0;i
p[start]=s[start];
dist[start]=0;
book[start]=1;
for(int k=1;k
} book[j]=1;
for(int v=0;v
}for(int u=0;u
}} printf("%d %d",dist[end],p[end]);
return 0;
}
1459 迷宮遊戲
基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 收藏 關注 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的起點和終...
51node 1459 迷宮遊戲
1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...
51NOD1459 迷宮遊戲
1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...