11.6 DAG最长路
DAG:有向无环图
1.求整个DAG中的最长路径(即:不固定终点和起点)
2.固定终点,求DAG中的最长路径
问题1
给定一个有向无环图,如何求解整个图的所有路径中权值之和最大的那条
令:dp[i]表示从i号顶点出发能获得的最长路径长度。dp[i]的最大值即是DAG的最长路径长度
dp[i]=max{
dp[j]+length(i->j)
}j是i的所有直接后继
#include<iostream>
#include<cstring>
using namespace std;const int N=100;
int dp[N],G[N][N];
int n,choose[N];int DP(int i){if(dp[i]>0) return dp[i];for(int j=0;j<n;j++){if(G[i][j]!=0){int temp=DP(j)+G[i][j];if(temp>dp[i]){dp[i]=temp;choose[i]=j;//在最长路径中更新i的后继是j}}}return dp[i];
}void printPath(int i){//i是最大dp[i]的下标cout<<i;while(choose[i]!=-1){//初始化-1 d到-1说明到头了i=choose[i];//巧妙往前走了一步cout<<"->"<<i;//输出i不是chosoe[i] 已经复制给i了}cout<<endl;
}int main(){freopen("input2.txt","r",stdin);//领接矩阵存储while(cin>>n){memset(dp,0,sizeof(dp));memset(choose,-1,sizeof(choose));for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>G[i][j];//0代表不通}}int max=0;DP(max);for(int i=1;i<n;i++){if(dp[max]<DP(i)) max=i;}printf("长度:%d\n路径:",dp[max]);printPath(max);}return 0;
}
测试用例:
问题二;
dp[i]表示从i号顶点出发到终点T能获得最长路径
边界dp[T]=0 dp[i]初始化为-INF
#include<iostream>
#include<cstring>
using namespace std;const int N=100;
const int INF=-INT_MAX;
int dp[N],G[N][N];
int n,choose[N];
bool vis[N];int DP(int i){if(vis[i]) return dp[i];vis[i]=true;for(int j=0;j<n;j++){if(G[i][j]!=INF){dp[i]=max(dp[i],DP(j)+G[i][j]);choose[i]=j;}}return dp[i];
}void printPath(int i){//i是最大dp[i]的下标cout<<i;while(choose[i]!=-1){//初始化-1 d到-1说明到头了i=choose[i];//巧妙往前走了一步cout<<"->"<<i;//输出i不是chosoe[i] 已经复制给i了}cout<<endl;
}int main(){freopen("input2.txt","r",stdin);//领接矩阵存储// cout<<INF<<endl;while(cin>>n){memset(dp,0,sizeof(dp));memset(choose,-1,sizeof(choose));memset(vis,0,sizeof(vis));//bool型初始化0 0==falsefor(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>G[i][j];//0代表不通或者到自己if(G[i][j]==0) G[i][j]=INF;}}//★★int T;cin>>T;dp[T]=0;vis[T]=true;int max=0;DP(max);for(int i=1;i<n;i++){if(dp[max]<DP(i)) max=i;}printf("以%d为终点\n",T);printf("最大路径长度:%d\n路径:",dp[max]);printPath(max);cout<<endl;}return 0;
}
11.6 DAG最长路相关推荐
- POJ - 3160 Father Christmas flymouse DAG最长路
又来做这一道缩点的裸题,发现图转化为DAG后明显是一个最长路,那么有没有固定都求法呢,查询资料后发现的确是一种固定的做法. DAG最长路,分为两种固定终点和不固定终点. 令dp[i]表示从i顶点出发能 ...
- 【EOJ Monthly 2019.02 - E】中位数(二分 ,中位数 ,−1/1变换,dp求解DAG最长路)
题干: E. 中位数 单测试点时限: 10.0 秒 内存限制: 256 MB "你的地图是一张白纸,所以即使想决定目的地,也不知道路在哪里." QQ 小方最近在自学图论.他突然想出 ...
- DAG最长路(最短路)
DAG就是有向无环图. DAG上的最长或者最短路是很重要的一类问题.很多问题都可以转化为DAG上的最长或者最短路径的问题.DAG求最短和最长路的方法一样. 本算法主要解决2个问题 1)求整个DAG中的 ...
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...
- 【POJ - 3160】Father Christmas flymouse(Tarjan缩点,DAG最长路)
题干: After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends s ...
- 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题Skiing(拓扑序求DAG最长路)
题意: 给定一个有向无环图,求该图的最长路. 思路: 由于是有向无环图,所以最长路肯定是一个入度为0到出度为0的路径,拓扑序在确定当前点之前能够考虑到所有到它的情况,所以最后取个最值即可. 代码: # ...
- DAG最长路问题 hdu-1224
用DFS+记忆化写了一下,拓扑排序+DP的我还没弄明白.据说Codeforces 721C就是这类题目,因为有费用限制,DFS不太好写,有时间把DP法想明白来. #include <iostre ...
- nyoj 10 skiing(DAG上的最长路,备忘录方法)
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑 ...
- (dag模型+最长路+字典序)嵌套矩形
题目: 有 n 个矩形,每个矩形可以用两个整数 a, b 描述,表示它的长和宽.矩形 X(a, b) 可以嵌套在矩形 Y(c, d) 中当且仅当 a<c, b<d,或者 b<c, a ...
最新文章
- Python的语言特点
- 微软表示Edge的性能更优于Chrome和Firefox
- C语言及程序设计初步例程-33 三种循环语句
- 天津大学计算机学院院长及副院长,李晓红 教授
- deepin系统转为windows_windows系统下安装深度系统deepin
- 花生采摘(洛谷-P1086)
- android Launcher——数据加载与变更
- 【FinalShell】win10 / win 11:远程连接 Linux 工具 FinalShell 下载、安装
- 产业分析:2021抖音数据报告
- “某某云词典” – 纠结的初体验
- 相机镜头光学中的一些疑难问题的解释
- python制作购物秒杀脚本,以淘宝秒杀脚本为例!
- java.io.FileNotFoundException: class path resource [com/wisely/highlight_spring4/ch2/aware/text.txt]
- 如何让文字变成语音?推荐三个免费把文字变成音频软件
- 宝塔面板分析网站蜘蛛日志?
- 京东2015校园招聘技术类笔试题
- VMwear虚拟机安装动态网卡和静态网卡(Basic Service版)
- hdu 1210 Eddy's 洗牌问题
- 51单片机入门教程_LED篇
- 点列图、横向像差、径向像差、畸变