`
huyifan951124
  • 浏览: 83215 次
社区版块
存档分类
最新评论

NYOJ677 EK算法求解最大流

 
阅读更多

题目大意:中文题。。。

算法思路:这里明显是求最小割的。那么什么是最小割呢?最小割就是所有割的权值之和的最小值,那么什么是割呢?割就是如果把图中的一条边或几条边去掉之后使得图变得不连通。这里可以用一个叫做最大流最小割的定理:在任意一个只有一个源和一个汇的图来说,最小割就等于最大流。因此可以把问题转化为求最大流的问题。这里用ek算法求解最大流。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define MAXN 205
#define INF 0xfffffff
int t;
int n,m,p,a1,a2,a,b,src,sink;
int maps[MAXN][MAXN],pre[MAXN];
queue<int>que;
bool bfs(int s,int des)
{

    memset(pre,-1,sizeof(pre));
    while(!que.empty())
        que.pop();
    pre[s]=0;
    que.push(s);
    while(!que.empty())
    {
        int index=que.front();
        que.pop();
        for(int i=s;i<=des;i++)
        {
            if(pre[i]==-1&&maps[index][i]>0)
            {
                pre[i]=index;
                if(i==des)
                    return true;
                que.push(i);
            }



        }


    }
    return false;
}
int MaxFlow(int s,int des)
{
    int maxflow=0;
    while(bfs(s,des))
    {
        int minflow=INF;
        for(int i=des;i!=s;i=pre[i])
            minflow=min(minflow,maps[pre[i]][i]);
        for(int i=des;i!=s;i=pre[i])
        {
            maps[pre[i]][i]-=minflow;
            maps[i][pre[i]]+=minflow;
        }
        maxflow+=minflow;
    }
    return maxflow;
}
int main()
{

    scanf("%d",&t);
    int sym=0;
    while(t--)
    {
        memset(maps,0,sizeof(maps));
        sym++;
        scanf("%d%d%d",&n,&m,&p);
        src=0;sink=n;
        for(int i=1;i<=p;i++)
        {
            scanf("%d",&a1);
            maps[src][a1]=maps[a1][src]=INF;
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&a,&b);
            maps[a][b]=maps[b][a]=1;
        }

        printf("Case #%d: %d\n",sym,MaxFlow(src,sink));

    }

    return 0;
}

 

0
1
分享到:
评论

相关推荐

    ACM在线评测系统 NYOJ 题库 离线看题网页版 nyoj

    1. **题目展示**:NYOJ题库包含多种类型的编程题目,涵盖基础算法、数据结构、数学逻辑等多个领域,旨在训练用户的思维能力和编程实践能力。用户可以通过离线看题网页版访问这些题目,即使在无网络连接的情况下也能...

    nyoj部分ACM答案

    这里引入了两个常用的头文件:`iostream`用于处理标准输入输出流,而`stdio.h`则是C语言的标准输入输出库,通常用于处理文件输入输出操作,在这里主要是为了使用`scanf`函数读取输入数据。 ##### 命名空间 ```cpp ...

    算法-矩形嵌套(NYOJ-16)(包含源程序).rar

    《算法-矩形嵌套(NYOJ-16)》是针对计算机科学中的一个典型问题进行探讨的资源包,其中包含了解决该问题的源程序。这个问题涉及到数据结构、图论以及算法设计等多个核心领域,是编程竞赛或算法学习中的常见题目。在...

    NYOJ题目 离线版

    NYOJ的题目涵盖了算法、数据结构、数学、逻辑推理等多个领域,对于准备ACM比赛或是提升编程技能的人来说,是绝佳的实践材料。每道题目都会给出具体的问题描述、输入输出格式、示例测试用例以及题目限制等信息,用户...

    nyoj16.rar_site:www.pudn.com

    它的应用广泛,包括在数据结构设计、排序算法优化以及某些复杂问题的求解中。 这个问题的核心是理解如何构建和更新动态规划状态。一般来说,我们可以定义一个dp数组,其中dp[i]表示以第i个元素结尾的最长单调递增子...

    ACM题库题库啊

    “北大ACM题库.zip”可能包含了北京大学ACM竞赛团队收集或整理的历年比赛题目,这些题目通常涵盖了算法设计、数据结构、数学逻辑等多个领域,对于提高编程能力、算法理解和问题解决技巧有着极大的帮助。题库可能按照...

    nyoj_lvy实战开发系列《一》:发送JSON信息,加密数据解密算法,UnionID机制说明

    前期小程序开发只进行到根据微信用户登录获取的code 去微信的API去获取到该用户的openId和session_key,到了第二阶段,老大让我重写OAuthManager的代码来实现微信小程序和微信公众号平台获取用户信息的优化,即将...

    nyoj 61 传纸条(一)

    双线程动态规划问题,很值得练习。传一个ac代码,测试一下csdn的功能。

    NYOJ.290.DictionaryTree.zip_trie树c_字典树_高级数据结构

    Trie树的高级应用还包括压缩Trie树(Patricia Trie)和Trie树的变种,如Aho-Corasick算法,它在Trie树的基础上添加了“失败指针”以实现同时匹配多个模式的功能。在实际编程中,理解和掌握Trie树可以帮助我们更高效...

    南阳理工oj stl练习ac代码

    STL(Standard Template Library,标准模板库)是C++编程语言中的一个重要组成部分,它提供了一系列高效、灵活的容器、迭代器、算法和函数对象,极大地简化了C++程序员的工作。南阳理工学院的OJ(Online Judge)平台...

    南阳理工学院OJ第1版解题报告V1.0.pdf

    贪心算法的应用案例,优先选用半径较大的喷水器,确保最大效率。这种策略在资源分配或成本优化问题中十分常见。 #### 7. 街区最短路径问题 此题可以通过暴力枚举邮局位置求解,但最优解法是利用中位数特性来确定...

    经典动态规划 南阳104最大和

    给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。

    nyoj_lvy实战开发系列《三》: 获取城市信息

    由于微信小程序没有方法可以获得当前用户所在城市的信息,所以需要调用方法来获取城市信息,用了两个方法去发送请求并返回城市信息  1. @Controller public class WechatLocationManager { private Logger logger ...

    nyoj_lvy实战开发系列《二》: 微信端开发:登录小程序

    这个小程序的主要目的是为了用户用微信的用户信息登录后将用户信息授权存入自己的数据库中,这样以后每次微信登录得到的code 所得到的 openid 可以在项目的数据库中查到该用户的相关信息。 在测试的过程中,需要用户...

Global site tag (gtag.js) - Google Analytics