打卡信奥刷题(1015)用C++实现信奥 P1476 休息中的小呆

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<1000<m≤1200<m\le 1200<m1200<i≤1000<i\le 1000<i1000<j≤1000<j\le 1000<j1000<k≤10000<k\le 10000<k1000

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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值