P1476 休息中的小呆
题目描述
当大家在考场中接受考验(折磨?)的时候,小呆正在悠闲(欠扁)地玩一个叫“最初梦想”的游戏。游戏描述的是一个叫 pass 的有志少年在不同的时空穿越对抗传说中的大魔王 chinesesonic 的故事。小呆发现这个游戏的故事流程设计得很复杂,它有着很多的分支剧情,但不同的分支剧情是可以同时进行的,因此游戏可以由剧情和剧情的结束点组成,某些剧情必须要在一些特定的剧情结束后才能继续发展。为了体验游戏的完整性,小呆决定要看到所有的分支剧情——完成所有的任务。但这样做会不会耽误小呆宝贵的睡觉时间呢?所以就请你来解决这个问题了。
输入格式
小呆会给你一个剧情流程和完成条件的列表,
其中第一行有一个数 nnn,表示总共有 nnn 个剧情结束点;
第二行一个数 mmm,表示有 mmm个不同的剧情;
下面的 mmm 行中每行有三个数,表示从剧情结束点 iii 必须完成一个耗费时间为 kkk 的剧情才能到达剧情结束点 jjj。
输出格式
你要告诉小呆完成整个游戏至少需要多少时间,以及要经过的所有可能的剧情结束点(按升序输出)。
输入输出样例 #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
说明/提示
数据范围及约定
对于全部数据,0<n<1000<n<1000<n<100,0<m≤1200<m\le 1200<m≤120,0<i≤1000<i\le 1000<i≤100,0<j≤1000<j\le 1000<j≤100,0<k≤10000<k\le 10000<k≤1000。
C++实现
#include<bits/stdc++.h>
using namespace std;
int n,m,dis[1005][1005];
int main()
{
cin>>n>>m;
for(int i=1;i<=n+1;i++)//初始化
for(int j=1;j<=n+1;j++)
{
if(i==j)
dis[i][j]=0;
else
dis[i][j]=1e9;
}
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
dis[u][v]=min(dis[u][v],-w);//谨防重边(不一定有)
}
for(int k=1;k<=n+1;k++)
{
for(int i=1;i<=n+1;i++)
{
for(int j=1;j<=n+1;j++)
{
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
cout<<-dis[1][n+1]<<’ ‘<<endl;
for(int i=1;i<=n+1;i++)
if(dis[1][i]+dis[i][n+1]==dis[1][n+1])
cout<<i<<’ ';
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容