您的位置:首页 > 编程语言 > C语言/C++

Hdu 4280 最大流<模板>.cpp

2012-09-15 21:33 453 查看
[b]题意:[/b]

给了一个T 代表有 T 组数据

每组数据给出 n 个点和 m 条边

然后接下来 n 行..x, y 表示每个点的坐标

然后 m 行..a b w 表示 a 点和 b 点之间有权值 w..

求最大流..

[b]思路:[/b]

主要是最大流的方法..

最大流ISAP,邻接表+GAP+当前弧优化

[b]Tips:[/b]

理解用法..

[b]Code:[/b]

View Code

#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;
#define clr(x) memset(x, 0xff, sizeof(x))
#define min(a,b)(a)<(b)?(a):(b)

const int INF = 0x1f1f1f1f;
const int maxn = 100010;
const int maxm = 200010;
struct Edge
{
int from;
int to;
int next;
int w;
}edge[maxm];
int tot;
int head[maxn];

void add(int s, int u, int w)
{
edge[tot].from = s;
edge[tot].to = u;
edge[tot].w = w;
edge[tot].next = head[s];
head[s] = tot++;
edge[tot].from = u;
edge[tot].to = s;
edge[tot].w = w;
edge[tot].next = head[u];
head[u] = tot++;
}

int q[maxn];
int cnt[maxn];
int d[maxn];
int low[maxn];
int cur[maxn];

int maxflow(int s, int t, int n)
{
int *front = q, *rear = q;
for(int i = 1; i <= n; ++i) {
d[i] = n;
cnt[i] = 0;
}
cnt
= n-1;
cnt[0]++;
d[t] = 0;
*rear++ = t;
while(front < rear) {
int v = *front++;
for(int i = head[v]; i != -1; i = edge[i].next) {
if(d[edge[i].to] == n && edge[i^1].w > 0) {
d[edge[i].to] = d[v] + 1;
cnt
--;
cnt[d[edge[i].to]]++;
*rear++ = edge[i].to;
}
}
}

int flow = 0, u = s, top = 0;
low[0] = INF;
for(int i = 1; i <= n; ++i) {
cur[i] = head[i];
}
while(d[s] < n) {
int &i = cur[u];
for(; i != -1; i = edge[i].next) {
if(edge[i].w > 0 && d[u] == d[edge[i].to]+1) {
low[top+1] = min(low[top], edge[i].w);
q[++top] = i;
u = edge[i].to;
break;
}
}
if(i != -1) {
if(u == t) {
int minf = low[top];
for(int p = 1, i; p <= top; ++p) {
i = q[p];
edge[i].w -= minf;
edge[i^1].w += minf;
}
flow += minf;
u = s;
low[0] = INF;
top = 0;
}
}
else {
int old_du = d[u];
cnt[old_du]--;
d[u] = n-1;
for(int i = head[u]; i != -1; i = edge[i].next)
if(edge[i].w > 0 && d[u] > d[edge[i].to]) {
d[u] = d[edge[i].to];
}
cnt[++d[u]]++;
if(d[u]<n)
cur[u] = head[u];
if(u != s) {
u = edge[q[top]].from;
--top;
}
if(cnt[old_du] == 0) break;
}
}
return flow;
}

struct Node
{
int x;
int y;
}node[100010];

int main()
{
int i, j, k;
int T, n, m;
int a, b, c;
int start, end;
while(scanf("%d", &T) != EOF)
while(T--)
{
start = end = 1;
tot = 0;
clr(head);

scanf("%d %d", &n, &m);
for(i = 1; i <= n; ++i) {
scanf("%d %d", &node[i].x, &node[i].y);
if(node[i].x > node[end].x) {
end = i;
}
if(node[i].x < node[start].x) {
start = i;
}
}

while(m--) {
scanf("%d %d %d", &a, &b, &c);
add(a, b, c);
}

int ans = maxflow(start, end, n);
printf("%d\n", ans);
}
return 0;
}


[b]题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4280[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: