【BZOJ1638】[Usaco2007 Mar]Cow Traffic 奶牛交通【DAG】【拓扑排序】【DP】

原创 2016年05月31日 16:27:54

【题目链接】

对于一条边(u, v),经过这条边的次数为(1到u的路径个数)*(v到n的路径个数)。

正反跑两次拓扑序,然后枚举边,统计答案。


一开始以为(1到u的路径个数)就是经过边(u, v)的次数,结果WA啦。

/* Telekinetic Forest Guard */
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <utility>

using namespace std;

typedef long long LL;
typedef pair<int, int> pii;

const int maxn = 5005, maxm = 50005;

int n, m, head[maxn], cnt, in[maxn], out[maxn], dp[maxn], dp2[maxn], q[maxn];

struct _edge {
	int v, next;
} g[maxm << 1];

pii e[maxm];

inline int iread() {
	int f = 1, x = 0; char ch = getchar();
	for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
	for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
	return f * x;
}

inline void add(int u, int v) {
	g[cnt] = (_edge){v, head[u]};
	head[u] = cnt++;
}

int main() {
	n = iread(); m = iread();
	for(int i = 1; i <= n; i++) head[i] = -1; cnt = 0;
	for(int i = 1; i <= m; i++) {
		int u = iread(), v = iread();
		e[i] = pii(u, v);
		add(u, v); add(v, u); out[u]++; in[v]++;
	}

	int h = 0, t = 0;
	for(int i = 1; i <= n; i++) if(!in[i]) dp[q[t++] = i] = 1;
	while(h != t) {
		int u = q[h++];
		for(int i = head[u]; ~i; i = g[i].next) if(~i & 1) {
			dp[g[i].v] += dp[u];
			in[g[i].v]--;
			if(!in[g[i].v]) q[t++] = g[i].v;
		}
	}

	h = t = 0;
	for(int i = 1; i <= n; i++) if(!out[i]) dp2[q[t++] = i] = 1;
	while(h != t) {
		int u = q[h++];
		for(int i = head[u]; ~i; i = g[i].next) if(i & 1) {
			dp2[g[i].v] += dp2[u];
			out[g[i].v]--;
			if(!out[g[i].v]) q[t++] = g[i].v;
		}
	}

	int ans = 0;
	for(int i = 1; i <= m; i++) ans = max(ans, dp[e[i].first] * dp2[e[i].second]);
	printf("%d\n", ans);
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

【BZOJ1194】[HNOI2006]潘多拉的盒子【BFS】【SCC】【拓扑排序】【DAG最长路】【自动机】

【题目链接】 这题有毒orz。 判断两个自动机是否有升级关系,BFS一次就行了orz。两个自动机都从0开始,同时走0,同时走1。如果一个自动机到达输出点,而另一个没到达,那么没有升级关系。 ...
  • BraketBN
  • BraketBN
  • 2016年04月23日 17:15
  • 532

夕拾算法进阶篇:32)DAG最长路(动态规划DP)

之前介绍了DAG有向无环图以及拓扑排序,如何求解DAG的最长路,也就是所谓的“”关键路径”,但求解关键的路径的做法对初学者来说实在不易。因此下面介绍一种简便的方法,来求解DAG最长路(最短路的思想是一...
  • jiangpeng59
  • jiangpeng59
  • 2017年02月27日 22:50
  • 1672

DAG图与拓扑排序

【问题描述】       有N个士兵,编号依次为1,2,3,…,N, 队列训练时,指挥官要把一些士兵从高到矮依次排成一行。但现在指挥官不能直接获得每个人的身高信息,只能获...
  • qq_35546304
  • qq_35546304
  • 2016年07月08日 16:12
  • 782

【bzoj1018】【SHOI2008】【堵塞的交通traffic】

1018: [SHOI2008]堵塞的交通trafficTime Limit: 3 Sec Memory Limit: 162 MB Submit: 2252 Solved: 711 [Sub...
  • FZHvampire
  • FZHvampire
  • 2015年08月01日 10:52
  • 1996

算法: 有向无环图(DAG)的拓扑排序

定义: 拓扑排序是对有向无环图(DAG)的顶点的一种排序, 使得如果存在一条从v到w的路径,那么在排序中w就出现在v的后面。 如果图含有环,那么拓扑排序是不可能的。试想有3个正整数,a比b大,b比c...
  • u012674931
  • u012674931
  • 2015年10月22日 15:25
  • 4877

【SHOI 2008】【BZOJ 1018】堵塞的交通traffic

发现很多有关区间联通问题的题线段树都可以做,不论是1列还是2列。这题的易错点在于两个端点x,yx,y之间的可行路径不一定在区间[x,y][x,y]之间,有可能是从其他区间绕过来的,想明白这一点,区间的...
  • Lcomyn
  • Lcomyn
  • 2015年07月11日 16:38
  • 1088

【bzoj1018】[SHOI2008]堵塞的交通traffic 线段树维护连通性

Description有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条...
  • LOI_DQS
  • LOI_DQS
  • 2016年03月27日 23:45
  • 533

应用拓扑排序来解决DAG(directed acylic graph)的单源最短路径问题

熟悉图的人可以知道,对于单源最短路径的问题,我们可以用bellman-ford算法,或者dijkstra算法来解决,bellman-ford可以解决 有向无环图中边的权值为负数的情况,但是dijkst...
  • zzran
  • zzran
  • 2013年05月14日 16:50
  • 1789

uva11324(tarjan缩点 + DAG图上的简单dp)

思路:先缩点,再构图,最后dp。dp[u] = max(dp[u],dfs(v) + val[u]); #include #include #include #include #includ...
  • KIJamesQi
  • KIJamesQi
  • 2015年10月02日 14:03
  • 503

Python 数据结构与算法——拓扑排序

几乎在所有的项目,甚至日常生活,待完成的不同任务之间通常都会存在着某些依赖关系,这些依赖关系会为它们的执行顺序行程表部分约束。对于这种依赖关系,很容易将其表示成一个有向无环图(Directed Acy...
  • lanchunhui
  • lanchunhui
  • 2016年03月22日 19:18
  • 1363
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【BZOJ1638】[Usaco2007 Mar]Cow Traffic 奶牛交通【DAG】【拓扑排序】【DP】
举报原因:
原因补充:

(最多只允许输入30个字)