博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 721C Journey(拓扑排序+DP)
阅读量:4507 次
发布时间:2019-06-08

本文共 1421 字,大约阅读时间需要 4 分钟。

<>

题目大意:

一个DAG图有n个点,m条边,走过每条边都会花费一定的时间,问你在不超过T时间的条件下,从1到n点最多能够经过几个节点。

解题分析:

对这个有向图,我们进行拓扑排序,并且在拓扑排序的过程中,用dp来进行状态的转移,$dp[i][j]$表示,在以$i$为终点的且经过$j$个点的路径中,所花的最少时间。

#include 
using namespace std;#define pb push_backconst int N = 5e3+5;int dp[N][N],path[N][N],indeg[N];bool vis[N];int n,m,T;struct Edge{ int to,val; };vector
G[N];inline void Toposort(){ queue
q; memset(dp,0x3f,sizeof(dp)); dp[1][1]=0; for(int i=1;i<=n;i++) if(!indeg[i]){ vis[i]=true;q.push(i); } while(!q.empty()){ int u=q.front();q.pop(); vis[u]=true; for(int i=0;i
dp[u][j-1]+cost){ dp[v][j]=dp[u][j-1]+cost; path[v][j]=u; //记录转移到该状态的节点 } } } if(!indeg[v])q.push(v); } }}void Output(int now,int num){ //输出路径 if(now==1){ printf("%d",now);return; } Output(path[now][num],num-1); printf(" %d",now);}inline void Print(){ int res=0; for(int i=n;i>=1;i--){ if(dp[n][i]<=T){ res=i; break; } }printf("%d\n",res); if(res)Output(n,res); puts("");}int main(){ scanf("%d%d%d",&n,&m,&T); for(int i=1;i<=m;i++){ int u,v,w;scanf("%d%d%d",&u,&v,&w); G[u].pb(Edge{v,w}); indeg[v]++; } Toposort(); Print();}

 

转载于:https://www.cnblogs.com/00isok/p/10606684.html

你可能感兴趣的文章
VIM-->基础操作汇总
查看>>
oracle cursor
查看>>
Response.StatusCode的HTTP状态代码列表
查看>>
win7下maven安装和配置
查看>>
C# 多线程编程 ThreadStart ParameterizedThreadStart
查看>>
Android Camera Parameters 方法出错,求教
查看>>
一个仿照系统UIAlertView写的提示框
查看>>
Genymotion集成到Eclipse
查看>>
代码简洁之四 统一抽象层次
查看>>
IOS 缩放图片常用方法
查看>>
软件工程课
查看>>
Pycharm-连接服务器
查看>>
[Leetcode] The Skyline Problem
查看>>
okhttp异步请求流程和源码分析
查看>>
【集合框架】JDK1.8源码分析之Comparable && Comparator(九)
查看>>
Flutter之内置动画(转)
查看>>
uni-app中onLoad不起作用
查看>>
多线程概述
查看>>
Linux_ubuntu命令-用户、权限管理
查看>>
Knowladge_网站学习_RSS 学习
查看>>