您的位置:首页 > 理论基础 > 计算机网络

HDU 4289 Control(网络流)

2013-04-23 09:28 429 查看
题意:有N个城市 M条无向边 有一恐怖分子要从某一城市到另一城市 打算在某些城市安放一些SA 去抓住他
但若在某个城市安放SA需要一定费用 求要抓到恐怖分子 最少的费用是多少?

思路:网络流问题。建一超级源点和汇点与原源点、汇点相连,然后把一个城市拆成两个点 边权为其费用
两相连城市间的边权为无穷大 求其最大流即可。

//62MS
1176K

#include <stdio.h>

#include <string.h>

#define L(u) ((u) << 1)

#define R(u) ((u) << 1 | 1)

#define VM 420

#define EM 100000

#define inf 0x3f3f3f3f

struct E

{

int
to,cap,nxt;

}edge[EM];

int head[VM],gap[VM],dist[VM],cur[VM],pre[VM];

int e,src,des,n,m;

void addedge (int cu,int cv,int cw)

{

edge[e].to =
cv;

edge[e].cap
= cw;

edge[e].nxt
= head[cu];

head[cu] =
e;

e ++;

edge[e].to =
cu;

edge[e].cap
= 0;

edge[e].nxt
= head[cv];

head[cv] =
e;

e ++;

}

int min (int a ,int b)

{

return a > b ?
b : a;

}

int sap ()

{

memset
(dist,0,sizeof(dist));

memset
(gap,0,sizeof (dist));

memcpy
(cur,head,sizeof(dist));

int res =
0;

int u =
pre[src] = src;

int aug =
inf;

gap[0] =
n;

while
(dist[src] < n)

{

loop:

for (int &i = cur[u];i != -1;i = edge[i].nxt)

{

int v = edge[i].to;

if (edge[i].cap && dist[u] ==
dist[v] + 1)

{

aug = min (aug,edge[i].cap);

pre[v] = u;

u = v;

if (v == des)

{

res += aug;

for (u = pre[u];v != src;v = u,u = pre[u])

{

edge[cur[u]].cap -= aug;

edge[cur[u]^1].cap += aug;

}

aug = inf; //

}

goto loop;

}

}

int mindist = n; //

for (int i = head[u];i != -1;i = edge[i].nxt)

{

int v = edge[i].to;

if (edge[i].cap && mindist
> dist[v])

{

cur[u] = i;

mindist = dist[v];

}

}

if ((--gap[dist[u]]) == 0)

break;

dist[u] = mindist + 1;

gap[dist[u]] ++;

u = pre[u];

}

return
res;

}

int main()

{

int i;

while
(~scanf("%d%d", &n, &m))

{

e = 0;

memset(head,
-1, sizeof(head));

scanf("%d%d", &src, &des);

addedge(0,
L(src), inf);

addedge(R(des), R(n + 1), inf);

src =
0;

des = R(n +
1);

int u, v,
c;

for (i=1;
i<=n; ++i)

{

scanf("%d",
&c);

addedge(L(i), R(i), c);

addedge(R(i), L(i), c);

}

for (i=1;
i<=m; ++i)

{

scanf("%d%d", &u, &v);

addedge(R(u), L(v), inf);

addedge(R(v), L(u), inf);

}

n =
2*(n+1);

printf("%d\n", sap());

}

return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: