Codeforces 721C [dp][拓扑排序]
/*
题意:给你一个有向无环图。给一个限定t。
问从1点到n点,在不超过t的情况下,最多可以拜访几个点。
保证至少有一条路时限不超过t.
思路:
1.由无后向性我们可以知道(取决于该图是一个DAG),这题一定可以dp。
2.dp[i][j]代表,到达点i,并且拜访了j个城市的最短时间。
wa点:
没有初始化数组中的0..
*/ #include<bits/stdc++.h>
#define N 5050
using namespace std;
int inf=0x3f3f3f3f;
int num[N];
bool vis[N];
int dp[N][N];
struct edge{
int id;
int w;
edge *next;
};
edge edges[N];
edge *adj[N];
int ednum;
inline void addedge(int a,int b,int w){
edge *tmp=&edges[ednum++];
tmp->id=b;
tmp->w=w;
tmp->next=adj[a];
adj[a]=tmp;
}
int fromx[N][N];
int main()
{
int n,m,t,a,b,w;
scanf("%d%d%d",&n,&m,&t);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
dp[i][j]=inf;
}
}
for(int i=;i<=m;i++){
scanf("%d%d%d",&a,&b,&w);
addedge(a,b,w);
num[b]++;
}
dp[][]=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(vis[j]||num[j])continue;
vis[j]=;
for(edge *it=adj[j];it;it=it->next){
num[it->id]--;
for(int k=;k<=n;k++){
if(dp[it->id][k]>dp[j][k-]+it->w){
dp[it->id][k]=dp[j][k-]+it->w;
fromx[it->id][k]=j;
}
}
}
break;
}
} for(int i=n;i>=;i--){
if(dp[n][i]<=t){
printf("%d\n",i);
stack<int>ss;
int x=n,y=i;
ss.push(n);
while(fromx[x][y]!=){
ss.push(fromx[x][y]);
x=fromx[x][y];
y--;
}
ss.push();
while(!ss.empty()){
int pp=ss.top();
ss.pop();
printf("%d ",pp);
}
break;
}
} }
Codeforces 721C [dp][拓扑排序]的更多相关文章
- CodeForces 721C Journey(拓扑排序+DP)
<题目链接> 题目大意:一个DAG图有n个点,m条边,走过每条边都会花费一定的时间,问你在不超过T时间的条件下,从1到n点最多能够经过几个节点. 解题分析:对这个有向图,我们进行拓扑排序, ...
- The Preliminary Contest for ICPC Asia Nanjing 2019 - D Robots(概率dp+拓扑排序)
这题概率dp + 拓扑排序可以写 改天补解释 #include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; ve ...
- CodeForces - 919D Substring (拓扑排序+dp)
题意:将一个字符串上的n个字符视作点,给出m条有向边,求图中路径上最长出现的相同字母数. 分析:首先如果这张图中有环,则可以取无限大的字符数,在求拓扑排序的同时可以确定是否存在环. 之后在拓扑排序的结 ...
- Codeforces Round #460 (Div. 2)_D. Substring_[dp][拓扑排序]
题意:一个有向图,每个结点 被赋予一个小写字母,一条路径的value等与这条路径上出现次数最多的字母的数目,求该图的最大value 比赛时,用dfs超时,看官方题解用的dp和拓扑排序,a--z用0-2 ...
- Codeforces 919D Substring (拓扑排序+树形dp)
题目:Substring 题意:给你一个有向图, 一共有n个节点 , m条变, 一条路上的价值为这个路上出现过的某个字符最多出现次数, 现求这个最大价值, 如果价值可以无限大就输出-1. 题解:当这个 ...
- Codeforces 919D Substring ( 拓扑排序 && DAG上的DP )
题意 : 给出含有 N 个点 M 条边的图(可能不连通或者包含环),每个点都标有一个小写字母编号,然后问你有没有一条路径使得路径上重复字母个数最多的次数是多少次,例如图上有条路径的顶点标号顺序是 a ...
- cf919D 线性dp+拓扑排序
/* 给定一张有向图,图上每个结点都有一个字符,现在要求出一条路径,要使路径上某字符出现的次数最多 如果有环,输出-1即可 拓扑排序+dp dp[i][26]表示排序到结点i时26个字符出现的次数 在 ...
- BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们也 ...
- ZJU 1346 Comparing Your Heroes 状态压缩DP 拓扑排序的计数
做多校的时候遇见一个求拓扑排序数量的题,就顺便来写了一下. 题意: 你有个朋友是KOF的狂热粉丝,他有一个对其中英雄的强弱比较,让你根据这些比较关系来给这些英雄排名.问一共有多少种排名方式. 思路: ...
随机推荐
- JavaEE 7技术一览
参见此文: https://my.oschina.net/Barudisshu/blog/334903 perfect
- 【BZOJ】2719 银河之星
可以将棋子分为9种类型.且可以通过合并使得两个不同种类棋子转换为另一种棋子(不过要注意棋盘大小,有的时候硬要合并会到棋盘外面,可以先把棋盘全部转换,然后枚举每一个棋子的转换).然后把状态压成一个十位的 ...
- rails之 Migrations (转)
1.简介 在rails中用migration可以很方便的管理数据库的结构.可以创建数据库,创建表,删除表,添加字段,删除字段,整理数据. migration就是一系列的class,这些类都继承了Act ...
- 二分查找C++
#include <iostream> using namespace std; //二分查找:每次都从中间位置寻找,如果找到了就返回,如果没找到, //则分两种情况: //(1)中间元素 ...
- sphinx 增量索引 实现近实时更新
一.sphinx增量索引的设置 数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少.例如.原来的数据有几百万条 ...
- 05——C++自己合成的函数
C++编译器自己合成的构造函数: 默认构造函数 copy构造函数 copy assigment操作符 析构函数(编译器产生的析构时non-virtual) copy assignment(当含有con ...
- D - Half of and a Half 大数
D - Half of and a Half Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I ...
- Linux 进程退出后自动启动
/********************************************************************** * Linux 进程退出后自动启动 * 说明: * 在系 ...
- 十分钟了解分布式计算:GraphLab
GraphLab是一个面向大规模机器学习/图计算的分布式内存计算框架,由CMU在2009年开始的一个C++项目,这里的内容是基于论文 Low, Yucheng, et al. "Distri ...
- springmvc学习笔记--Interceptor机制和实践
前言: Spring的AOP理念, 以及j2ee中责任链(过滤器链)的设计模式, 确实深入人心, 处处可以看到它的身影. 这次借项目空闲, 来总结一下SpringMVC的Interceptor机制, ...