题意就是某个人去游览,起点是1点,终点是n点,他总的游览时间不能超过t,第一行给你3个数字,点的个数n,边的个数m,时间t,然后底下m行数据,每行代表一条边,边的起点,终点和权值(走过去花的时间),然后问你,她想尽量多的游览景点,还要求总时间不能超过t(他在景点不会逗留,所以只要计算路程花费的时间即可),问你怎么走,输出路径

题目我不会做,看了题解,dalao的思路的拓扑+dp,直接dp貌似不行,为什么用拓扑+dp呢- -,我感觉里面就是让你求最长的哈密顿路径- -,这就很哲学了- -,看了dalao的代码,给dalao的代码加点注释,方便以后自己查看

#include <iostream>
#include <stdio.h>
#include <queue>
#include <vector>
#include <string.h>
#include <map>
using namespace std;
const int Maxn = 5e3+;
const int INF = 0x3f3f3f3f; struct Node{//构造函数
int to;
int dis;
Node(){}
Node(int a,int b){
to = a;
dis = b;
}
}; int dp[Maxn][Maxn];
std::vector<Node> G[Maxn];
std::queue<int> q;
std::map<int,int> du;
int ans[Maxn];
int pre[Maxn][Maxn]; int main(){
int n,m,t;
scanf("%d%d%d",&n,&m,&t);
memset( dp,INF,sizeof( dp ) );//初始化为无穷大
int Begin,End,w;
for( int i = ; i <= m; i++ ){
scanf("%d%d%d",&Begin,&End,&w);
G[Begin].push_back( Node( End,w ) );//将与之begin相邻的点放在vector里
du[End]++;//End点的入度+1 为下面拓扑排序做准备
}
dp[][] = ;
for( int i = ; i <= n; i++ ){//将入度为0的点压入队列中(kahn算法拓扑排序)
if( !du[i] ){
q.push(i);
}
}
while( !q.empty() ){
int i = q.front();
q.pop();
for( auto x : G[i] ){//取出所有的与i点为起点的点(即处理i线段)
Node tmp = x;
if( !--du[tmp.to] ){//将i点的那条线段的终点入度减一,如果为0,压入队列(kahn算法)
q.push(tmp.to);
}
for( int k = ; k <= n; k++ ){//起点必须为1点,所以从2开始
if( dp[i][k-] + tmp.dis < dp[tmp.to][k] ){//dp[i][j]代表从1到i点,经历了j条边的权值总和
dp[tmp.to][k] = dp[i][k-] + tmp.dis;//如果1到i经历了k-1条边+从i到i.to那条边的和小于从1到i经历了k条边
pre[tmp.to][k] = i;//就更新一下值(尽量选大的)
//记录下父亲节点
}
}
}
}
int num;
for( int i = n; i >= ; i-- ){
if( dp[n][i] <= t ){//找到第一个满足条件的点
num = i;
break;
}
}
ans[num] = n;//终点为n
for( int i = n,j = num; j > ; i = pre[i][j],j-- ){
ans[j-] = pre[i][j];//记录下路径
}
printf("%d\n",num);
for( int i = ; i <= num; i++ ){
printf("%d ",ans[i]);
}
return ;
}

codeforces 721C (拓扑+dp)的更多相关文章

  1. CodeForces - 721C 拓扑排序+dp

    题意: n个点m条边的图,起点为1,终点为n,每一条单向边输入格式为: a,b,c     //从a点到b点耗时为c 题目问你最多从起点1到终点n能经过多少个不同的点,且总耗时小于等于t 题解: 这道 ...

  2. Codeforces Round #374 (Div. 2) A , B , C 水,水,拓扑dp

    A. One-dimensional Japanese Crossword time limit per test 1 second memory limit per test 256 megabyt ...

  3. 洛谷.5284.[十二省联考2019]字符串问题(后缀自动机 拓扑 DP)

    LOJ BZOJ 洛谷 对这题无话可说,确实比较...裸... 像dls说的拿拓扑和parent树一套就能出出来了... 另外表示BZOJ Rank1 tql... 暴力的话,由每个\(A_i\)向它 ...

  4. luogu2149 Elaxia的路线 (dijkstra+拓扑dp)

    先标记上一个人所有最短路上的边(同时也要标记反向边) 然后拿着另一个人最短路上的边(会构成一个DAG)去做拓扑dp,记从原点到某个点的最大的某个路径的被标记的边的个数 #include<bits ...

  5. UVA 11324.The Largest Clique tarjan缩点+拓扑dp

    题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...

  6. CodeForces 721C Journey(拓扑排序+DP)

    <题目链接> 题目大意:一个DAG图有n个点,m条边,走过每条边都会花费一定的时间,问你在不超过T时间的条件下,从1到n点最多能够经过几个节点. 解题分析:对这个有向图,我们进行拓扑排序, ...

  7. Codeforces 721C [dp][拓扑排序]

    /* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG), ...

  8. codeforces 721C (拓排 + DP)

    题目链接:http://codeforces.com/contest/721/problem/C 题意:从1走到n,问在时间T内最多经过多少个点,按路径顺序输出. 思路:比赛的时候只想到拓排然后就不知 ...

  9. codeforces 721C C. Journey(dp)

    题目链接: C. Journey time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...

随机推荐

  1. poj 2406 Power Strings (kmp 中 next 数组的应用||后缀数组)

    http://poj.org/problem?id=2406 Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submiss ...

  2. CSS 负边距自适应布局

    单列定宽单列自适应布局: <!DOCTYPE HTML> <html> <head>     <meta charset="UTF-8"& ...

  3. [BZOJ 4033] [HAOI2015] T1 【树形DP】

    题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...

  4. MySQL函数讲解(MySQL函数大全)

    讲mysql函数之前先给大家展示一下利用mysql函数的一个例子: SELECT i.item_id, i.item_name, i.cid, i.last_update_time, u.url, u ...

  5. UPUPW PHP环境集成包

    UPUPW PHP环境集成包 http://www.upupw.net/

  6. Cannot generate SSPI context---MS SQL ERROR

    http://www.cnblogs.com/newr2006/archive/2011/08/25/2153253.html Additional error information from SQ ...

  7. Ubuntu14.04下如何开启Mysql远程访问

    近来开发项目的需要,需要开启服务器下的Mysql远程访问权限(方法有很多),学习了一下,这里只演示个人觉得比较简单的一种方法. 对用户授权方法: 1. 在目录/etc/mysql下找到my.cnf,用 ...

  8. ANDROID_MARS学习笔记_S01原始版_002_实现计算乘积及menu应用

    一.代码 1.xml(1)activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk ...

  9. mplayer windows configure修改

    相信大家在编译mplayer的时候,都会遇到一个问题,就是那个折腾人的mplayer会检测当面目录下有没有ffmpeg的文件夹. 没有的话,mplayer会启动git进行漫长的下载ffmpeg源码.其 ...

  10. Linux Kernel KVM 'apic_get_tmcct()'函数拒绝服务漏洞

    漏洞版本: Linux Kernel 漏洞描述: Bugtraq ID:64270 CVE ID:CVE-2013-6367 Linux Kernel是一款开源的操作系统. Linux KVM LAP ...