描述
当你们在考场中接受考验(折磨?)的时候,小呆正在清闲(欠扁)地玩一个叫“最初梦想”的游戏。游戏描述的是一个叫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表示游戏结束。你要告诉小呆完成整个游戏至少须要多少时间以及要通过的全部可能的剧情结束点(按升序输出)。样例以下:ios
样例1
样例输入1
4 5 1 2 2 2 3 2 3 5 3 1 4 3 4 5 3
样例输出1
7 1 2 3 5
限制
各个测试点1s测试
来源
Vivian Snow
From 正·蠢盟演义——战略版 Fools-League Tacticsspa
思路:最短路径变成最大路径。设计
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 }