题意:有N个城市,现在城市S出现了一伙歹徒,他们想运送一些炸弹到D城市,不过警方已经得到了线报知道他们的事情,不过警察不知道他们所在的具体位置,所以只能采取封锁城市的办法来阻断暴徒,不过封锁城市是需要花费一定代价的,由于警局资金比较紧张,所以想知道如果完全阻断暴徒从S城市到达D城市的最小需要花费的代价。
输入:
首先输入的是N,M表示有N个城市M条道路,接下来有N行每行一个数字表示封锁这个城市的代价,然后M行道路,每个道路都连接两个城市(路没有交叉,并且是双向路)。
分析:这应该叫做最小割,有向图的最小割等于最大流,所以我们只需要把这个图变成有向图就可以直接用最大流的方式做了,因为给的是每个城市的封锁花费,所以需要把每个城市都进行拆点处理,连接边的时候也需要从拆点连接未拆点(为了让路线经过城市)。

下面是AC代码。

==========================================================================================================
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
using namespace std; const int MAXN = ;
const int oo = 1e8+; struct Edge{int v, flow, next;}edge[MAXN*MAXN];
int Head[MAXN], cnt;
int layer[MAXN];///分层 void InIt()
{
    cnt = ;
    memset(Head, -, sizeof(Head));
}
void AddEdge(int u, int v, int flow)
{
    edge[cnt].v = v;
    edge[cnt].flow = flow;
    edge[cnt].next = Head[u];
    Head[u] = cnt++;     swap(u, v);     edge[cnt].v = v;
    edge[cnt].flow = ;
    edge[cnt].next = Head[u];
    Head[u] = cnt++;
}
bool bfs(int start, int End)
{
    queue<int> Q;Q.push(start);
    memset(layer, , sizeof(layer));
    layer[start] = ;     while(Q.size())
    {
        int u = Q.front();Q.pop();         if(u == End)return true;         for(int j=Head[u]; j!=-; j=edge[j].next)
        {
            int v = edge[j].v;             if(layer[v] == false && edge[j].flow)
            {
                layer[v] = layer[u] + ;
                Q.push(v);
            }
        }
    }     return false;
}
int dfs(int u, int MaxFlow, int End)
{
    if(u == End)return MaxFlow;     int uflow = ;     for(int j=Head[u]; j!=-; j=edge[j].next)
    {
        int v = edge[j].v;         if(layer[v]==layer[u]+ && edge[j].flow)
        {
            int flow = min(MaxFlow-uflow, edge[j].flow);
            flow = dfs(v, flow, End);             edge[j].flow -= flow;
            edge[j^].flow += flow;
            uflow += flow;             if(uflow == MaxFlow)break;
        }
    }     if(uflow == )
        layer[u] = ;
    return uflow;
}
int dinic(int start, int End)
{
    int MaxFlow = ;     while(bfs(start, End) == true)
        MaxFlow += dfs(start, oo, End);     return MaxFlow;
} int main()
{
    int N, M;     while(scanf("%d%d", &N, &M) != EOF)
    {
        int i, u, v, cost, start, End;         InIt();         scanf("%d%d", &start, &End);         for(i=; i<=N; i++)
        {
            scanf("%d", &cost);
            AddEdge(i, i+N, cost);
        }         while(M--)
        {
            scanf("%d%d", &u, &v);
            AddEdge(u+N, v, oo);
            AddEdge(v+N, u, oo);
        }         printf("%d\n", dinic(start, End+N));
    }     return ;
}

I - Control - HDU 4289 (最大流)的更多相关文章

  1. hdu 4289 最大流拆点

    大致题意:     给出一个又n个点,m条边组成的无向图.给出两个点s,t.对于图中的每个点,去掉这个点都需要一定的花费.求至少多少花费才能使得s和t之间不连通. 大致思路:     最基础的拆点最大 ...

  2. (网络流 最大流 Dinic || SAP)Control -- hdu --4289

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4289 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  3. HDU 4289 Control (网络流,最大流)

    HDU 4289 Control (网络流,最大流) Description You, the head of Department of Security, recently received a ...

  4. HDU 1532 最大流入门

    1.HDU 1532 最大流入门,n个n条边,求第1点到第m点的最大流.只用EK做了一下. #include<bits/stdc++.h> using namespace std; #pr ...

  5. HDU 4289 Control(最大流+拆点,最小割点)

    题意: 有一群恐怖分子要从起点st到en城市集合,你要在路程中的城市阻止他们,使得他们全部都被抓到(当然st城市,en城市也可以抓捕).在每一个城市抓捕都有一个花费,你要找到花费最少是多少. 题解: ...

  6. hdu 4289 Control(最小割 + 拆点)

    http://acm.hdu.edu.cn/showproblem.php?pid=4289 Control Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  7. HDU 4289:Control(最小割)

    http://acm.hdu.edu.cn/showproblem.php?pid=4289 题意:有n个城市,m条无向边,小偷要从s点开始逃到d点,在每个城市安放监控的花费是sa[i],问最小花费可 ...

  8. 【hdu 4289】Control

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=4289 [Description] 给出一个又n个点,m条边组成的无向图.给出两个点s,t.对于图中 ...

  9. HDU 4289 Control (最小割 拆点)

    Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

随机推荐

  1. firefox较慢

    Ctrl+Shift+Delete,清楚缓存.浏览历史.下载,效果不是很明显. 地址栏输入about:support,打开配置文件夹,删掉配置文件夹里的places.sqlite,urlclassif ...

  2. 函数os_file_pread

    /*******************************************************************//** Does a synchronous read ope ...

  3. JAVA将Excel中的报表导出为图片格式(一)问题背景

    如题所示,先抛出一个问题,如何使用JAVA将Excel中的报表导出为图片格式? 首先说一下这个问题的背景,也就是为什么博主会碰到这个问题 随着微信,易信之流大行其道,企业内部的办公交流.绩效考评甚至考 ...

  4. iOS开发:视图生命周期

    iOS应用的视图状态分为以下几种 在viewcontroller的父类UIViewController中可以看到如下代码,通过重写不同的方法对操作视图渲染. @available(iOS 2.0, * ...

  5. 一个简单的ORM制作(SQL帮助类)

    一个简单的ORM制作大概需要以下几个类: SQL执行类 CURD操作类 其他酱油类 先从SQL执行类说起,可能会涉及数据库的迁移等问题,所以需要定义一个接口以方便迁移到其他数据库, 事务没提供命名,若 ...

  6. HDU 3336 (KMP next性质) Count the string

    直接上传送门好了,我觉得他分析得非常透彻. http://972169909-qq-com.iteye.com/blog/1114968 #include <cstdio> #includ ...

  7. HDU 3746 (KMP求最小循环节) Cyclic Nacklace

    题意: 给出一个字符串,要求在后面添加最少的字符是的新串是循环的,且至少有两个循环节.输出最少需要添加字符的个数. 分析: 假设所给字符串为p[0...l-1],其长度为l 有这样一个结论: 这个串的 ...

  8. fastdfs-client-java 文件上传

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线服务,如相 ...

  9. uva 10054 The Necklac(欧拉回路)

    明显的欧拉回路,把颜色作为点,建图后,做一遍欧拉回路.不过我是现学的,打印路径上纠结了一下,发现随着FindEuler()的递归调用的结束,不断把点压入栈中,从后向前打印,遇到"支路&quo ...

  10. 【ASP.NET】编程点滴 :ASP.NET身份验证

    ASP.NET实际开发中身份验证 是一个不可回避的问题.在相当一段长的时间内,由于不求甚解,我对这个话题似懂非懂.今天就对它做个简单的小结. Authentication and Authorizat ...