POJ - 3249 Test for Job (在DAG图利用拓扑排序中求最长路)
题意
给出一个有n个结点,m条边的DAG图,每个点都有权值,每条路径(注意不是边)的权值为其经过的结点的权值之和,每条路径总是从入度为0的点开始,直至出度为0的点,问所有路径中权值最大者为多少,如下图,加粗的为权值最大者:

解题思路
这是在一个无起点、终点的图中的求最长路的问题,因此无法像一般的最长路问题那样求解。
首先,因为图中只存在点权,为了方便,我们一般将点权转化为边权:取每条边的权值为其终点的权值,将点权转化为边权。
然后,由于我们每条路径都是以入度为0的点开始,以出度为0的点结束,而且是求最大路,我第一想法就是AOV网中求事件的最晚完成时间,这两者是很相似的,不同的在于AOV网中有一个入度为0的源点和一个出度为0的汇点,而这个地方有多个入度为0的点和多个出度为0的点,不过实际的操作是完全一致的,都是利用拓扑排序的效果求最长路
为了方便理解,可以假设存在一个权值为0的点s向所有入度为0的点建边,然后把这个点当作起点,利用求拓扑序的时候,可以求出事件的最晚完成时间的效果,求其余各点到这个点的最长路,最后求出所有出度为0的点到s的最长路中的最大者,即为答案
代码区
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<string>
#include<fstream>
#include<vector>
#include<stack>
#include <map>
#include <iomanip> #define bug cout << "**********" << endl
#define show(x, y) cout<<"["<<x<<","<<y<<"] "
#define LOCAL = 1;
using namespace std;
typedef long long ll;
const ll inf = 1e18+;
const ll mod = 1e9 + ;
const int Max = 1e6 + ;
const int Max2 = 3e2 + ; struct Edge
{
int to,next;
ll dis;
}edge[Max<<]; int n, m;
ll val[Max];
int head[Max],tot;
int topo[Max],id; //记录每个点的拓扑序
int d_in[Max],d_out[Max]; //记录每个点的入度和出度
ll dist[Max]; //距离源点的最大距离 int init()
{
memset(head,-,sizeof(head));
tot = ;
memset(topo,,sizeof(topo));
id = ;
memset(d_in,,sizeof(d_in));
memset(d_out,,sizeof(d_out));
} void add(int u,int v,ll dis)
{
edge[tot].to = v;
edge[tot].dis = dis;
edge[tot].next = head[u];
head[u] = tot++;
} void topoSort()
{
queue<int>q; //存储入度为0的点
for(int i = ;i <= n ;i ++)
{
if(d_in[i] == )
{
q.push(i);
dist[i] = val[i]; //初始化
}
}
while(!q.empty())
{
int u = q.front();q.pop();
topo[u] = ++id;
for(int i = head[u] ; i != - ; i = edge[i].next)
{
int v = edge[i].to;
ll dis = edge[i].dis;
if(!topo[v])
{
d_in[v] --;
dist[v] = max(dist[v],dist[u] + dis);
if(d_in[v] == )
q.push(v);
}
}
} } int main()
{
#ifdef LOCAL
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
for(int i = ;i <= n ;i ++)
scanf("%lld",val+i);
for(int i = , u, v ; i <= m ;i ++)
{
dist[i] = -inf;
scanf("%d%d",&u,&v);
d_out[u] ++;
d_in[v]++;
add(u,v,val[v]); //以终点的权值作为边的权值
}
topoSort();
ll max_dis = -inf;
for(int i = ;i <= n ;i ++)
{
if(d_out[i] == ) //只对出度为0的点进行判断
{
max_dis = max(max_dis,dist[i]);
}
}
printf("%lld\n",max_dis);
}
return ;
}
POJ - 3249 Test for Job (在DAG图利用拓扑排序中求最长路)的更多相关文章
- POJ 3592--Instantaneous Transference【SCC缩点新建图 && SPFA求最长路 && 经典】
Instantaneous Transference Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 6177 Accep ...
- Vulnerable Kerbals CodeForces - 772C【拓展欧几里得建图+DAG上求最长路】
根据拓展欧几里得对于同余方程 $ax+by=c$ ,有解的条件是 $(a,b)|c$. 那么对于构造的序列的数,前一个数 $a$ 和后一个数 $b$ ,应该满足 $a*x=b(mod m)$ 即 $ ...
- 训练赛 Grouping(强连通分量缩点 + DAG求最长路)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=158#problem/F 大致题意:给出n个人和m种关系(ti,si),表示ti ...
- 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆. 现在 ...
- poj 2060 Taxi Cab Scheme(DAG图的最小路径覆盖)
题意: 出租车公司有M个订单. 订单格式: hh:mm a b c d 含义:在hh:mm这个时刻客人将从(a,b)这个位置出发,他(她)要去(c,d)这个位置. 规定1:从(a,b) ...
- UVA 10029 Edit Step Ladders ——(DAG求最长路)
题意:升序的给出一本若干个单词,每个单词都可删除一个字母,添加一个字母或者改变一个字母,如果任意一个操作以后能变成另外一个字典中的单词,那么就连一条有向边,求最长的长度. 分析:DAG的最长路和最短路 ...
- POJ 2762推断单个联通(支撑点甚至通缩+拓扑排序)
Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14789 ...
- POJ 2472 106 miles to Chicago(Dijstra变形——史上最坑的最长路问题)
题目链接 :http://poj.org/problem?id=2472 Description In the movie "Blues Brothers", the orphan ...
- Paint the Grid Again (隐藏建图+优先队列+拓扑排序)
Leo has a grid with N × N cells. He wants to paint each cell with a specific color (either black or ...
随机推荐
- Python爬虫 Urllib库的基本使用
1.构造Requset 其实上面的urlopen参数可以传入一个request请求,它其实就是一个Request类的实例,构造时需要传入Url,Data等等的内容.比如上面的两行代码,我们可以这么改写 ...
- BZOJ1070: [SCOI2007]修车(最小费用最大流,思维)
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...
- Asyncio之EventLoop笔记
使用事件循环 Python3.4 采用了一个强大的框架来支持代码的并发执行: asyncio.这个框架使用事件循环来编排回调和异步任务. 事件循环位于事件循环策略的上下文中-这是 asyncio 所特 ...
- ./与sh区别
1 ./需要执行权限,使用脚本文件中第一行#!指定的shell(解释器)来执行命令(譬如常见的/bin/bash),不指定系统会调用默认shell程序 2 sh不需要执行权限,是使用sh这个s ...
- Leetcode题目200.岛屿数量(BFS+DFS+并查集-中等)
题目描述: 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 ...
- Leetcode题目53.最大子序和(动态规划-简单)
题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连 ...
- 搬运 centos7.2 apache 绑定二级目录 访问依然是apache页面
<VirtualHost *:80>ServerName xx.comDocumentRoot /var/www/html/xx</VirtualHost>
- git status: HEAD detached from origin/master问题的解决
问题:执行git status,提示: HEAD detached from origin/master 原因:分支选错了,后续的提交都提交到了一个匿名分支之上,整个状态是游离了的 解决方法: 1.查 ...
- 华为鸿蒙OS能取代安卓吗?
先回答问题,不能,起码几年之内不存在这种可能.8月9日华为的开发者大会上,余承东说:鸿蒙是一款基于微内核的全场景分布式OS.鸿蒙OS的设计初衷是为满足全场景智慧体验的高标准的连接要求,为此华为提出了4 ...
- react-hook的简单的动画插件react-simple-animate(其实是react插件,但是这里只介绍react-hook的简单用法)
1.useAnimate(普通anima动画的形式) (1)js const animate = useAnimate({ complete: { display: 'none' }, //动画完成的 ...