codeforces 721C (拓排 + DP)
题目链接:http://codeforces.com/contest/721/problem/C
题意:从1走到n,问在时间T内最多经过多少个点,按路径顺序输出。
思路:比赛的时候只想到拓排然后就不知道怎么办了......先拓扑排序,再按照拓扑的顺序进行DP,dp[to][j](到i点走过j个点最短时间) = min(dp[to][j], dp[i][j] + dis)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e3 + 3;
const int inf = 0x3f3f3f3f;
struct node
{
int to;
int dis;
node() {}
node(int a,int b) : to(a), dis(b) {}
};
vector <node> G[N];
queue<int> q;
int dp[N][N],pre[N][N],ans[N],deg[N];
int main()
{
int n,m,t,num;
scanf("%d %d %d",&n,&m,&t);
memset(dp,inf,sizeof(dp));
for(int i = 1; i <= m; i++)
{
int u,v,d;
scanf("%d %d %d",&u,&v,&d);
G[u].push_back(node(v,d));
deg[v]++;
}
dp[1][1] = 0;
for(int i = 1; i <= n; i++)
{
if(!deg[i])
q.push(i);
}
while(!q.empty())
{
int i = q.front();
q.pop();
for(int j = 0; j < G[i].size(); j++)
{
node tmp = G[i][j];
if(!--deg[tmp.to])
q.push(tmp.to);
for(int k = 2; k <= n; k++)
{
if(dp[i][k-1] + tmp.dis < dp[tmp.to][k])
{
dp[tmp.to][k] = dp[i][k-1] + tmp.dis;
pre[tmp.to][k] = i;
}
}
}
}
for(int i = n; i >= 1; i--)
{
if(dp[n][i] <= t)
{
num = i;
break;
}
}
ans[num] = n;
for(int i = n,j = num; j > 1; i = pre[i][j], j--)
ans[j-1] = pre[i][j];
printf("%d\n",num);
for(int i = 1; i <= num; i++)
printf("%d ",ans[i]);
return 0;
}
codeforces 721C (拓排 + DP)的更多相关文章
- The Party and Sweets CodeForces - 1159C (拓排)
优化连边然后拓排. #include <iostream> #include <sstream> #include <algorithm> #include < ...
- codeforces 721C C. Journey(dp)
题目链接: C. Journey time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...
- CodeForces - 721C 拓扑排序+dp
题意: n个点m条边的图,起点为1,终点为n,每一条单向边输入格式为: a,b,c //从a点到b点耗时为c 题目问你最多从起点1到终点n能经过多少个不同的点,且总耗时小于等于t 题解: 这道 ...
- HDU5438--Ponds (拓排+BFS)
点击打开链接 题意:给定n个池塘,m对池塘相连,现在要将与少于2个池塘相连的池塘拆除,形成森林,求节点数为奇数的树权值之和 思路:按照拓排的思想不断删除度数小于2的节点 #include<bit ...
- HDU-2647 Reward ,逆拓排。
Reward 发工资,以前看过这题,做没做忘了(应该是没做). 很明显的拓排.但数据范围这么大,吓得我当时就不敢动手.后来找题解发现还是相当于两层循环(are you kidding me?)当时卡在 ...
- [Codeforces 1201D]Treasure Hunting(DP)
[Codeforces 1201D]Treasure Hunting(DP) 题面 有一个n*m的方格,方格上有k个宝藏,一个人从(1,1)出发,可以向左或者向右走,但不能向下走.给出q个列,在这些列 ...
- CodeForces 340E Iahub and Permutations 错排dp
Iahub and Permutations 题解: 令 cnt1 为可以没有限制位的填充数字个数. 令 cnt2 为有限制位的填充数字个数. 那么:对于cnt1来说, 他的值是cnt1! 然后我们对 ...
- Codeforces 721C [dp][拓扑排序]
/* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG), ...
- codeforces 721C (拓扑+dp)
题意就是某个人去游览,起点是1点,终点是n点,他总的游览时间不能超过t,第一行给你3个数字,点的个数n,边的个数m,时间t,然后底下m行数据,每行代表一条边,边的起点,终点和权值(走过去花的时间),然 ...
随机推荐
- netty4.0.x源码分析—bootstrap
Bootstrap的意思就是引导,辅助的意思,在编写服务端或客户端程序时,我们都需要先new一个bootstrap,然后基于这个bootstrap调用函数,添加eventloop和handler,可见 ...
- Java注解入门
注解的分类 按运行机制分: 源码注解:只在源码中存在,编译后不存在 编译时注解:源码和编译后的class文件都存在(如@Override,@Deprecated,@SuppressWarnin ...
- ecshop后台新功能及权限的添加
1.在后台"推荐管理"里添加"推荐人分成"."会员分成"两个操作功能以及权限 index.php?act=menu incluedes/in ...
- Python面向对象高级之类的特殊成员
上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段.方法和属性三大类成员,并且成员名前如果有两个下划线,则表示该成员是私有成员,私有成员只能由类内部调用.无论人或事物往往都有不按套路出 ...
- css个人随笔,适合新手总结整理
CSS的3种引用方式:1.外部样式表 都是在head标签内使用Link标签来引用的.2.内部样式表 <style type="text/css"> </style ...
- arrayLen
var i;for (i = categoryList.length - 1; i >= 0; i -= 1) { var categoryValue=categoryList[i]; if ( ...
- sasasa
/***************************************************************************************** 文件:app_to ...
- php 常用数组操作
php常用的数组操作函数,包括数组的赋值.拆分.合并.计算.添加.删除.查询.判断.排序等 array_combine 功能:用一个数组的值作为新数组的键名,另一个数组的值作为新数组的值 <?p ...
- google closure继承模块三:goog.base()源码分析
直接看代码吧: base: function (me, opt_methodName, var_args) { var caller = arguments.callee.caller; if (ca ...
- 基于WWF搭建的通用审批流程
月明星稀,却不见明月:蛾儿雪柳暗香飘过,纵使回首千百回,却不知,心已灭:壮志未酬,却落得个多情应该笑我:扬帆起航,却不知,帆已破.这是我刚离职时的心情,曾几何时,真的想呆在一家公司,做一名优秀的技术管 ...