1. 程式人生 > >華東交通大學2018年ACM“雙基”程式設計競賽 K

華東交通大學2018年ACM“雙基”程式設計競賽 K

MIKU醬是個玩遊戲氪金的人,遊戲公司給她制定了新的規則,如果想從關卡i到關卡j,你需要交一些錢就可以了,但同時,MIKU醬的爸爸zjw很愛她,所以她可以每過一關就向她爸要一次錢,但她爸每次給他的錢是固定的,MIKU醬是個不會節省的女孩,哪怕每次多出來的錢,她也會拿去買肥宅快樂水,所以每次要的錢一定花完,因為MIKU醬不想捱罵,所以希望每次他爸給她的錢最少。 tips(到達第n關即通過,每到達一關一定能通過這關)

輸入描述:

多組輸入,每個樣例第一行輸入兩個整數n,m(2<=n<=200,1<=m<=1000)表示關卡和規則的數量,接下來m行規則,每行輸入x,y,w(w<=1000),表示從關卡x到y需要繳納w的費用,保證題目有解,不會出現x=y的情況

輸出描述:

輸出一行,代表最少的錢
示例1

輸入

複製
4 4
1 2 2
1 3 1
2 4 3
3 4 1

輸出

複製
1


 1 #include <cstdio>
 2
#include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string> 10 #include <cmath> 11 #include <cstdlib> 12 #include <ctime> 13 using
namespace std; 14 #define ll long long 15 #define P pair<int,int> 16 #define ph push_back 17 const int inf=0x3f3f3f3f; 18 int n,m,x,y,w; 19 const int N =220; 20 int dis[N]; 21 vector<P>ve[N]; 22 void init(){ 23 for(int i=0;i<N;i++) { 24 dis[i]=inf; 25 ve[i].clear();
26 } 27 } 28 int bfs(int sta){ 29 priority_queue<P,vector<P>,greater<P> >q; 30 dis[sta] =0; 31 q.push(P(0,sta)); 32 while(!q.empty()){ 33 P p =q.top(); 34 q.pop(); 35 int fi =p.first,se=p.second;//fi:最短路徑上到se位置的題目答案 36 if(se==n) return fi; 37 for(int i=0;i<ve[se].size();i++){ 38 P pp=ve[se][i]; 39 int ff=pp.first,ss=pp.second; 40 if(dis[ff]>max(ss,fi)){ 41 dis[ff]=max(ss,fi);//變小了 42 q.push(P(dis[ff],ff)); 43 } 44 } 45 } 46 return inf; 47 } 48 int main() 49 { 50 while(~scanf("%d%d",&n,&m)){ 51 init(); 52 for(int i=0;i<m;i++){ 53 scanf("%d%d%d",&x,&y,&w); 54 ve[x].ph(P(y,w)); 55 } 56 int xx = bfs(1); 57 printf("%d\n",xx); 58 } 59 return 0; 60 }