摘要:
HDU_1569 一开始没有什么思路,后来看了别人的解题报告说要去构造一个二分图转化成最小割去做。后来我又琢磨了一下,大概原理是这样的,如果把原图按i+j的奇偶性分成两部分(也就是染成国际象棋棋盘那样),并且相邻的格子之间连一条边的话,就变成了求最大权独立集了,而最大权独立集又等于SUM减去最小点权覆盖集,这样我们就转化成去求最小点权覆盖集了。而如果我们构造一个超级源点和二分图左边所有点相连并且边权为格子的权值,同时另二分图右边所有点和构造的一个超级汇点相连并且边权为格子的权值,并且把二分图中间的边的边权设为INF,这样求出的最小割就是最小点权覆盖集。因为如果是最小点权覆盖集的话,拿掉这些点. 阅读全文
posted @ 2011-10-14 18:39
Staginner
阅读(378)
评论(0)
推荐(0)
摘要:
HDU_1565一开始没有什么思路,后来看了别人的解题报告说要去构造一个二分图转化成最小割去做。后来我又琢磨了一下,大概原理是这样的,如果把原图按i+j的奇偶性分成两部分(也就是染成国际象棋棋盘那样),并且相邻的格子之间连一条边的话,就变成了求最大权独立集了,而最大权独立集又等于SUM减去最小点权覆盖集,这样我们就转化成去求最小点权覆盖集了。而如果我们构造一个超级源点和二分图左边所有点相连并且边权为格子的权值,同时另二分图右边所有点和构造的一个超级汇点相连并且边权为格子的权值,并且把二分图中间的边的边权设为INF,这样求出的最小割就是最小点权覆盖集。因为如果是最小点权覆盖集的话,拿掉这些点及其 阅读全文
posted @ 2011-10-14 18:38
Staginner
阅读(614)
评论(0)
推荐(0)
摘要:
UVA_10030对于题目中每个点的容量的限制,我们可以把一个点i拆成两个点2*i和2*i ^ 1,并连一条有向边2*i->2*i^1,容量为该点的容量限制,在建图的时候从2*i流入并从2*i^1流出即可。#include<stdio.h>#include<string.h>#define MAXD 210#define MAXM 81000#define INF 100000000int N, flow[MAXM], first[MAXD], next[MAXM], u[MAXM], v[MAXM], e;int work[MAXD], d[MAXD], q[M 阅读全文
posted @ 2011-10-14 14:32
Staginner
阅读(356)
评论(0)
推荐(0)
浙公网安备 33010602011771号