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;
}
但若在某个城市安放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;
}
相关文章推荐
- HDU&nbsp;4292&nbsp;Food(网络流)
- Hdu 2457 DNA repair (字符串_AC自…
- HDU 1010 Tempter of the Bone
- HDU 1423 Greatest Common Increas…
- HDU 1009 FatMouse' Trade(肥老鼠…
- ZZULI_TEAM_PRACTICE(1) HDU 1212…
- ZZULI 1617 (HDU 1686)Oulipo (…
- HDU 1754 I Hate It(线段树模版…
- hdu 4289 Control(网络流 最大流+拆点)(模板)
- hdu 4289 Control (拆点网络流)
- hdu 1317 XYZZY
- hdu 1688 Sightseeing
- hdu Rightmost Digit&&Leftmost Di…
- hdu 迷瘴
- poj&nbsp;1459&nbsp;power&nbsp;network(网络流&nbsp;di…
- HDU 2710 Max Factor
- HDU 2098 分拆素数和
- HDU 1718 Rank
- HDU 1279 验证角谷猜想
- Table Control 响应双击事件…