poj 3272 图上dp(经过某边的最大路径数量)
来源:互联网 发布:日久军警装备淘宝店 编辑:程序博客网 时间:2024/04/29 18:40
题意:给定一个有向无环图,其中具有n个点和m条边。已知出度为0的点只有n点。从所有入度为0的点出发到达n,问所有可能路径中,经过某条路的最大次数是多少。
题解:按照拓扑排序的顺序正向走一遍,记录到达某点的路径总数dp数组;从n出发反向走一遍,记录某点出发到终点的总情况数num数组。第二遍扫的时候枚举每条边,求该边对应两点所记录的两个信息之积的最大值。
#include <cstdio>#include <queue>#include <algorithm>#include <cstring>using namespace std;#define INF 0x3fffffff#define clr(s,t) memset(s,t,sizeof(s));#define N 5005int n,m;struct edge{ int y,next,flag;}e[50005<<1];int first[N],d[N],g[N],top,dp[N],num[N];void add(int x,int y,int flag){ e[top].y = y; e[top].flag = flag; e[top].next = first[x]; first[x] = top++;}int main(){ int i,a,b,now,res=0; queue<int> q; clr(first,-1); clr(dp, 0); clr(d,0); clr(g, 0); clr(num, 0); top = 0; scanf("%d %d",&n,&m); for(i = 1;i<=m;i++){ scanf("%d %d",&a,&b); add(a,b,1); add(b,a,2); d[b]++; g[a]++; } for(i = 1;i<=n;i++) if(!d[i]){ q.push(i); dp[i] = 1; } while(!q.empty()){ now = q.front(); q.pop(); for(i = first[now];i!=-1;i=e[i].next){ if(e[i].flag == 2) continue; dp[e[i].y] += dp[now]; d[e[i].y]--; if(!d[e[i].y]) q.push(e[i].y); } } num[n] = 1; q.push(n); while(!q.empty()){ now = q.front(); q.pop(); for(i = first[now];i!=-1;i=e[i].next){ if(e[i].flag == 1) continue; num[e[i].y] += num[now]; res = max(res,num[now]*dp[e[i].y]); g[e[i].y]--; if(!g[e[i].y]) q.push(e[i].y); } } printf("%d\n",res); return 0;}
0 0
- poj 3272 图上dp(经过某边的最大路径数量)
- poj 3281 最大流(牛吃喝的最大数量)
- 【DP】在矩阵中,选择一条从左上角到右下角、经过数字之和最大的路径
- 矩阵从左上角到右下角的最优路径使得经过路径上的权值和最大(最小)
- 路径所经过的数字的最大的总和
- poj 2029 二维树状数组(用给定大小矩形能够囊括的最大数量)
- POJ 1015-Jury Compromise 背包dp最大差 记录路径
- poj 1787 Charlie's Change(打印路径的多重背包 ->交易数量最大化)
- 圆形路径上,求某两点的最大的距离。
- POJ 2253 Frogger (单源最短路变型 求路径上最大边权值的最小值)
- poj 2559 dp(柱状图的最大面积)
- poj 1948 dp(组成面积最大的三角形)
- poj上的dp专题
- poj上的dp专题
- 51nod 1274 最长递增路径(图上的dp)
- 求矩阵左上角到右下角所经过点的和的最大距离和路径
- poj 2455 Secret Milking Machine 【二分 + 最大流】 【1到N不重复路径不少于T条时,求被选中路径上的最大边权值 的最小值】
- 数据包经过防火墙的路径
- Flatten Binary Tree to Linked List
- Window 对象
- crontab命令和服务详解
- android动画 -- view Animation
- opencv3实现图像修补-inpaint函数
- poj 3272 图上dp(经过某边的最大路径数量)
- iOS 获取系统通讯录
- python备忘
- opencv3寻找最小包围矩形-minAreaRect函数
- Oracle 11g R2 安装时提示找不到em.ear
- YII 获取系统级请求参数的常用方法
- 黑马程序员 面向对象(上)
- android群英传读书笔记---自定义ViewGroup
- 学习规划