poj1459 最大流Dinic

比较简单。

#include<stdio.h>
#include<string.h>
#include<queue>
#define maxn 110
#define INF 99999999
using namespace std;
int vis[maxn],n,map[maxn][maxn];
int min(int x,int y)
{return x<y?x:y;}
int dfs(int u,int low)
{
    int i,a;
    if(u==n+1)
        return low;
    for(i=0;i<=n+1;i++)
    {
        if(vis[i]==vis[u]+1&&map[u][i]>0)
        {
            a=dfs(i,min(low,map[u][i]));
            if(!a)continue;
            map[u][i]-=a;
            map[i][u]+=a;
            return a;
        }
    }
    return 0;
}
bool BFS()
{
    int i;
    queue<int>q;
    memset(vis,-1,sizeof(vis));
    vis[0]=0;
    q.push(0);
    while(!q.empty())
    {
        int t=q.front();
        q.pop();
        for(i=0;i<=n+1;i++)
        {
            if(vis[i]<0&&map[t][i]>0)
            {
                vis[i]=vis[t]+1;
                q.push(i);
            }
        }
    }
    if(vis[n+1]>0)return true;
    return false;
}
int main()
{
    int i,nc,np,m;
    while(scanf("%d %d %d %d",&n,&np,&nc,&m)!=EOF)
    {
        memset(map,0,sizeof(map));
        for(i=0;i<m;i++)
        {
            int x,y,z;
            while(getchar()!=‘(‘);
            scanf("%d,%d)%d",&x,&y,&z);
            map[x+1][y+1]+=z;
        }
        for(i=0;i<np;i++)
        {
            int x,y;
            while(getchar()!=‘(‘);
            scanf("%d)%d",&x,&y);
            map[0][x+1]=y;
        }
        for(i=0;i<nc;i++)
        {
            int x,y;
            while(getchar()!=‘(‘);
            scanf("%d)%d",&x,&y);
            map[x+1][n+1]=y;
        }
        int ans=0;
        while(BFS())
        {
            while(1)
            {
                int a=dfs(0,INF);
                if(!a)break;
                ans+=a;
            }
        }
        printf("%d\n",ans);
    }
}
时间: 2024-11-05 22:49:38

poj1459 最大流Dinic的相关文章

poj1459最大流

#include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <set> #include <qu

最大流 Dinic + Sap 模板

不说别的,直接上模板. Dinic+当前弧优化: struct Edge{ int x,y,c,ne; }e[M*2]; int be[N],all; int d[N],q[N]; int stack[N],top;//栈存的是边 int cur[N];//当前弧优化 void add(int x, int y, int z)//需保证相反边第一个为偶数 { e[all].x=x; e[all].y=y; e[all].c=z; e[all].ne=be[x]; be[x]=all++; e[a

【算法】网络最大流 Dinic

Dinic的大体思路是和EK差不多的(其实很多算法的大体思路都一样),只不过Dinic在每次寻找增广路时先bfs一下,给每个点都加上一个等级,而规定:只有等级相邻的两个点之间才能走,那么在dfs时就会减掉很多无用因此不必要的道路 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<queue> 6 using na

POJ训练计划1459_Power Network(网络流最大流/Dinic)

解题报告 这题建模实在是好建,,,好贱,,, 给前向星给跪了,纯dinic的前向星竟然TLE,sad,,,回头看看优化,,, 矩阵跑过了,2A,sad,,, /************************************************************************* > File Name: PowerN.cpp > Author: _nplus > Mail: [email protected] > Time: 2014年07月19日 星期

网络最大流 dinic算法

一句话题意:给出一个网络图,以及其源点和汇点,求出其网络最大流 //dinic算法; //时间复杂度O(V^2E); #include<bits/stdc++.h> #define inf 999999 #define maxn 200000 using namespace std; int n,m,s,t; int ans=0; struct Edge { int to,next,w; }; struct Edge edge[maxn]; int head[maxn],val[maxn],p

poj-1459-最大流dinic+链式前向星

title: poj-1459-最大流dinic+链式前向星 date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM-网络流-最大流 概述 这道是一道网络流里最大流的板子题,,, 暑期集训网络流草草水过,,连基本的算法都不知道有哪些,,,更别提怎么实现了,,,只知道网络流的大致的概念,, 今天花了一天的时间重新学习了一波,,,本以为这东西很简单,,,没想到不仅算法的实现一大堆的东西,,就连题目都有时候看不懂,,,,感受就是网络流的题不仅算法实

POJ 3281 Dining 最大流 Dinic算法

Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10768   Accepted: 4938 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has cooked fabulo

POJ 1149 PIGS (网络最大流 Dinic 建对图你就赢了)

PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17598   Accepted: 7977 Description Mirko works on a pig farm that consists of M locked pig-houses and Mirko can't unlock any pighouse because he doesn't have the keys. Customers come t

【uva 753】A Plug for UNIX(图论--最大流 Dinic)

题意:有N个插头,M个设备和K种转换器.要求插的设备尽量多,问最少剩几个不匹配的设备. 解法:给读入的各种插头编个号,源点到设备.设备通过转换器到插头.插头到汇点各自建一条容量为1的边.跑一次最大流就可得到最多匹配的设备数. 注意啊,我这个代码在神奇?的地方死循环了——判断队列为空的语句......Σ( ° △ °|||)︴所以大家主要看“行文思路” ? :-) 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring