1. 程式人生 > >vijos p1027休息中的小呆

vijos p1027休息中的小呆

可能 輸出 max ++ foo init ini lang amp

休息中的小呆

描述

當大家在考場中接受考驗(折磨?)的時候,小呆正在悠閑(欠扁)地玩一個叫“最初夢想”的遊戲。遊戲描述的是一個叫pass的有誌少年在不同的時空穿越對抗傳說中的大魔王chinesesonic的故事。小呆發現這個遊戲的故事流程設計得很復雜,它有著很多的分支劇情,但不同的分支劇情是可以同時進行的,因此遊戲可以由劇情和劇情的結束點組成,某些劇情必須要在一些特定的劇情結束後才能繼續發展。為了體驗遊戲的完整性,小呆決定要看到所有的分支劇情——完成所有的任務。但這樣做會不會耽誤小呆寶貴的睡覺時間呢?所以就請你來解決這個問題了。小呆會給你一個劇情流程和完成條件的列表,其中第一行有一個數n(0<n<100),表示總共有n個劇情結束點,第二行一個數m(0<m<=120),表示由m個不同的劇情,下面的m行中每行有三個數i(0<i<=100),j(0<j<=100),k(0<k<=1000),表示從劇情結束點i必須完成一個耗費時間為k的劇情才能到達劇情結束點j。註意,這m行中出現的1不是劇情結束點而是遊戲的開始,而n+1表示遊戲結束。你要告訴小呆完成整個遊戲至少需要多少時間以及要經過的所有可能的劇情結束點(按升序輸出)。樣例如下:

樣例1

樣例輸入1

4
5
1 2 2
2 3 2
3 5 3
1 4 3
4 5 3
Copy

樣例輸出1

7
1 2 3 5
Copy

限制

各個測試點1s

來源

Vivian Snow
From 正·蠢盟演義——戰略版 Fools-League Tactics

思路:最短路徑變成最大路徑。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5
using namespace std; 6 7 int n; 8 int m; 9 int a[130][130]; 10 11 void init() 12 { 13 int x,y,w; 14 scanf("%d",&n); n++; 15 scanf("%d",&m); 16 for(int i=1;i<=m;i++) 17 { 18 scanf("%d%d%d",&x,&y,&w); 19 a[x][y]=w; 20 }
21 } 22 23 void Floyd() 24 { 25 for(int k=1;k<=n;k++) 26 for(int i=1;i<=n;i++) 27 for(int j=1;j<=n;j++) 28 if(i!=j) 29 if(a[i][k]>0&&a[k][j]>0) 30 a[i][j]=max(a[i][j],a[i][k]+a[k][j]); 31 } 32 33 void output() 34 { 35 printf("%d\n",a[1][n]); 36 for(int i=1;i<=n;i++) 37 if(a[1][i]+a[i][n]==a[1][n]) 38 printf("%d ",i); 39 } 40 41 int main() 42 { 43 init(); 44 Floyd(); 45 output(); 46 }

vijos p1027休息中的小呆