HDU 4289 Control(最大流,最小割)

Problem Description:

  You, the head of Department of Security, recently received a top-secret information that a group of terrorists is planning to transport some WMD 1 from one city (the source) to another one (the destination). You know their date, source and destination, and they are using the highway network.
  The highway network consists of bidirectional highways, connecting two distinct city. A vehicle can only enter/exit the highway network at cities only.
  You may locate some SA (special agents) in some selected cities, so that when the terrorists enter a city under observation (that is, SA is in this city), they would be caught immediately.
  It is possible to locate SA in all cities, but since controlling a city with SA may cost your department a certain amount of money, which might vary from city to city, and your budget might not be able to bear the full cost of controlling all cities, you must identify a set of cities, that:
  * all traffic of the terrorists must pass at least one city of the set.
  * sum of cost of controlling all cities in the set is minimal.
  You may assume that it is always possible to get from source of the terrorists to their destination.
------------------------------------------------------------
1 Weapon of Mass Destruction

Input:

  There are several test cases.
  The first line of a single test case contains two integer N and M ( 2 <= N <= 200; 1 <= M <= 20000), the number of cities and the number of highways. Cities are numbered from 1 to N.
  The second line contains two integer S,D ( 1 <= S,D <= N), the number of the source and the number of the destination.
  The following N lines contains costs. Of these lines the ith one contains exactly one integer, the cost of locating SA in the ith city to put it under observation. You may assume that the cost is positive and not exceeding 107.
  The followingM lines tells you about highway network. Each of these lines contains two integers A and B, indicating a bidirectional highway between A and B.
  Please process until EOF (End Of File).

Output:

  For each test case you should output exactly one line, containing one integer, the sum of cost of your selected set.
  See samples for detailed information.

Sample Input:

5 6

5 3

5

2

3

4

12

1 5

5 4

2 3

2 4

4 3

2 1

Sample Output:

3

题意:恐怖分子计划将毒品从S城市运输到E城市,警察发现后准备在途中的城市全面封锁对他们进行逮捕,他们有很多路径可供选择从S到E,且路径是双向的,但是每次封锁需要花费,现在已知在每个城市进行封锁的花费,求最小的花费和。

由于给的权值不是在边上,而是在点上,所以需要进行割点处理:

最大流模板+拆点:

#include<stdio.h>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;

const int INF=0x3f3f3f3f;
const int N=20010;

struct node
{
    int v, fee, next;
}no[6*N];
int layer[N], head[N], k;

void Add(int a, int b, int c)
{
    no[k].v = b;
    no[k].fee = c;
    no[k].next = head[a];
    head[a] = k++;

    swap(a, b);

    no[k].v = b;
    no[k].fee = 0;
    no[k].next = head[a];
    head[a] = k++;
}

int BFS(int Start, int End)
{
    int i, u, v;
    queue<int>Q;

    memset(layer, 0, sizeof(layer));

    Q.push(Start);
    layer[Start] = 1;

    while (!Q.empty())
    {
        u = Q.front(); Q.pop();

        if (u == End) return 1;

        for (i = head[u]; i != -1; i = no[i].next)
        {
            v = no[i].v;
            if (no[i].fee && layer[v] == 0)
            {
                layer[v] = layer[u] + 1;
                Q.push(v);
            }
        }
    }

    return 0;
}

int DFS(int Start, int End, int mini)
{
    int i, v, fee = 0, ans;

    if (Start == End) return mini;

    for (i = head[Start]; i != -1; i = no[i].next)
    {
        v = no[i].v;

        if (no[i].fee && layer[v] == layer[Start]+1)
        {
            ans = min(no[i].fee, mini-fee);
            ans = DFS(v, End, ans);

            no[i].fee -= ans;
            no[i+1].fee += ans;
            fee += ans;

            if (fee == mini) break;
        }
    }

    if (fee == INF) layer[Start] = 0;

    return fee;
}

int Dinic(int Start, int End)
{
    int ans = 0;

    while (BFS(Start, End))
        ans += DFS(Start, End, INF);

    return ans;
}

int main ()
{
    int n, m, i, S, E, ans, a, b, c;

    while (scanf("%d%d", &n, &m) != EOF)
    {
        memset(head, -1, sizeof(head));
        k = 0;

        scanf("%d%d", &S, &E);
        for (i = 1; i <= n; i++)
        {
            scanf("%d", &c);
            Add(i, i+n, c); ///每个点i的权值现在保存到了i-i+n这条边上
        }
        for (i = 1; i <= m; i++)
        {
            scanf("%d%d", &a, &b);
            Add(a+n, b, INF);
            Add(b+n, a, INF); ///保证每个点之间有回路,由于是双向,所以操作两次
        }

        ans = Dinic(S, E+n); 

        printf("%d\n", ans);
    }

    return 0;
}
时间: 2024-11-10 14:36:00

HDU 4289 Control(最大流,最小割)的相关文章

HDU 4289 Control (网络流-最小割)

Control Problem Description You, the head of Department of Security, recently received a top-secret information that a group of terrorists is planning to transport some WMD 1 from one city (the source) to another one (the destination). You know their

HDU 4289 Control (最大流+拆点)

http://acm.hdu.edu.cn/showproblem.php?pid=4289 题目讲的是有一些恐怖分子要从S市去往D市,要求在一些城市中安排特工,保证一定能够抓住恐怖分子,因为安排特工需要一定的费用,所以希望找出最小的花费. 思路:可以把每个城市,即每个点拆分成进来的点和出去的点,如x点分成x和x+n,两点连接的边权值为x点上安排特工的费用.而如果x和y两点有连线,则连接x+n,y,然后求从S市到达D市的最大流.之所以能这样求,是因为在求最大流的过程中每次所更新的流量是所有边中最

hdu 4289 利用最大流思想求图的最小割

http://acm.hdu.edu.cn/showproblem.php?pid=4289 Problem Description You, the head of Department of Security, recently received a top-secret information that a group of terrorists is planning to transport some WMD 1 from one city (the source) to anothe

hdu 4289 Control(网络流 最大流+拆点)(模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4289 Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1545    Accepted Submission(s): 677 Problem Description You, the head of Department o

hdu 4289 Control (最大流)

hdu 4289 Control You, the head of Department of Security, recently received a top-secret information that a group of terrorists is planning to transport some WMD 1 from one city (the source) to another one (the destination). You know their date, sour

zoj3792--Romantic Value(最大流+最小割,求解割边)

Romantic Value Time Limit: 2 Seconds      Memory Limit: 65536 KB Farmer John is a diligent man. He spent a lot of time building roads between his farms. From his point of view, every road is romantic because the scenery along it is very harmonious an

最大流-最小割 MAXFLOW-MINCUT ISAP

简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理解,对于每条反向边,我们流过它相当于撤销了一条正向边的流量. 并且它是必须的: 而且从理论上,我们在加入反向边之后得到的最大流,我们从残余网络考虑. 我们要认识到,反向边不会使最大流流量减少,这是很显然的.有flow<=flow'. 接下来我们考虑所有点的流量是否可以只用正向边得到. 并且我们考察汇

hdu 4289 Control(最小割 + 拆点)

http://acm.hdu.edu.cn/showproblem.php?pid=4289 Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2247    Accepted Submission(s): 940 Problem Description You, the head of Department of Secu

HDU 4289 Control (最小割 拆点)

Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2139    Accepted Submission(s): 904 Problem Description You, the head of Department of Security, recently received a top-secret informati

HDU 4289 Control 最小割

Control 题意:有一个犯罪集团要贩卖大规模杀伤武器,从s城运输到t城,现在你是一个特殊部门的长官,可以在城市中布置眼线,但是布施眼线需要花钱,现在问至少要花费多少能使得你及时阻止他们的运输. 题解:裸的最小割模型,最小割就是最大流,我们把点拆成2个点,然后将原点与拆点建边,流量为在城市建立眼线的费用,然后拆点为出点,原点为入点,将可以到达的城市之间建流量为无穷的边. 最后求出s 到 t的拆点的最大流 那么就是这个题目的答案了. 代码: 1 #include<bits/stdc++.h>