P1476 休息中的小呆
题目描述
当大家在考场中接受考验(折磨?)的时候,小呆正在悠闲(欠扁)地玩一个叫“最初梦想”的游戏。游戏描述的是一个叫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。
输出格式:
你要告诉小呆完成整个游戏至少需要多少时间以及要经过的所有可能的剧情结束点(按升序输出)。
输入输出样例
输入样例#1: 复制
4 5 1 2 2 2 3 2 3 5 3 1 4 3 4 5 3
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 210 using namespace std; int n,m,x,y,z,f[N][N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } int main() { n=read(),m=read();n++; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=0; for(int i=1;i<=m;i++) { x=read(),y=read(),z=read(); f[x][y]=z; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j&&j!=k&&f[i][k]&&f[k][j]) f[i][j]=max(f[i][j],f[i][k]+f[k][j]); printf("%d\n",f[1][n]); for(int i=1;i<=n;i++) if(f[1][n]==f[1][i]+f[i][n]) printf("%d ",i); return 0; }