Dinic模板

prwang%%%

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <queue>

using namespace std;

struct Edge { int    to,w,next; }e[110000]; 

int    T,n,m,cnt=1,ver,S,TTT;
int    a[110],p[1100],level[1100];

inline void    Add_edge(const int x,const int y,const int z)
{
    e[++cnt].to=y;
    e[cnt].next=p[x];
    e[cnt].w=z;
    p[x]=cnt;
    return ;
}

bool    Bfs(const int SSS)
{
    int    i,t;
    queue<int>    Q;
    memset(level,0,sizeof(level));
    level[SSS]=1;
    Q.push(SSS);

    while(!Q.empty())
    {
        t=Q.front();Q.pop();
        for(i=p[t];i;i=e[i].next)
        {
            if(!level[e[i].to] && e[i].w)
            {
                level[e[i].to]=level[t]+1;
                Q.push(e[i].to);
            }
        }
    }

    return !!level[TTT];
}

int    Dfs(const int SSS,int    rest)
{
    if(SSS==TTT)return rest;
    const int    back_up=rest;
    for(int i=p[SSS];i;i=e[i].next)
    {
        if(e[i].w && level[e[i].to]==level[SSS]+1)
        {
            int    flow=Dfs(e[i].to,min(rest,e[i].w));
            e[i].w-=flow;
            e[i^1].w+=flow;
            if((rest-=flow)<=0)break;
        }
    }

    if(back_up==rest)level[SSS]=0;
    return back_up-rest;
}

void    Dinic(const int SSS)
{
    while(Bfs(SSS))Dfs(SSS,0x3f3f3f3f);
    return ;
}

int main()
{
    freopen("league.in","r",stdin);
    freopen("league.out","w",stdout);

    int    i,x,y;

    scanf("%d",&T);

    while(T--)
    {
        cnt=1,ver=0;
        memset(p,0,sizeof(p));
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;++i)
        {
            scanf("%d",&a[i]);
        }
        ver=n;
        for(i=1;i<=m;++i)
        {
            scanf("%d%d",&x,&y);
            if(x==n||y==n){a[n]+=2;continue;}
            ver++;
            Add_edge(ver,x,2);
            Add_edge(x,ver,0);
            Add_edge(ver,y,2);
            Add_edge(y,ver,0);
        }

        S=++ver,TTT=++ver;
        for(i=n+1;i<=ver-2;++i)
        {
            Add_edge(S,i,2);
            Add_edge(i,S,0);
        }
        for(i=1;i<=n;++i)
        {
            Add_edge(i,TTT,a[n]-a[i]-1);
            Add_edge(TTT,i,0);
        }

        Dinic(S);

        for(i=p[S];i;i=e[i].next)
        {
            if(e[i].w!=0)
            {
                printf("NO\n");
                goto Fail;
            }
        }
        printf("YES\n");
Fail:;
    }

    fclose(stdin);
    fclose(stdout);

    return 0;
}
时间: 2024-10-03 14:56:00

Dinic模板的相关文章

POJ 1273 Drainage Ditches (网络流Dinic模板)

Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage

USACO草地排水-网络流dinic模板

广搜计算层次图,在层次图上深搜.标准dinic模板. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<vector> 5 #include<queue> 6 #include<cmath> 7 #include<algorithm> 8 #include<string.h> 9 #define INF 0x7fffff

[POJ 1273] Drainage Ditches &amp; 最大流Dinic模板

Drainage Ditches Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a

洛谷P3376【模板】网络最大流  Dinic模板

之前的Dinic模板照着刘汝佳写的vector然后十分鬼畜跑得奇慢无比,虽然别人这样写也没慢多少但是自己的就是令人捉急. 改成邻接表之后快了三倍,虽然还是比较慢但是自己比较满意了.虽然一开始ecnt从0开始WA了一发... 之前的码风也十分鬼畜呀缩进只缩1.2格不懂自己怎么想的.. 反正今天就安心划划水. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #in

POJ 1273 Drainage Ditches (dinic模板)

题目链接:http://poj.org/problem?id=1273 很经典的最大流问题,用此总结dinic模板 dinic比E-K多了个DFS,只要明白什么是把图分层了,就不难理解了.BFS找增广路的同时把图分层,相当于记录了多条增广路,可以让每次dinic能处理尽量多的增广路. 模板: #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include &

网络流--最大流dinic模板

标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 1 #include<stdio.h> //差不多要加这么些头文件 2 #include<string.h> 3 #include<queue> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 const int maxm=150+5; //点的总数 8

【网络流#3】hdu 1532 - Dinic模板题

输入为m,n表示m条边,n个结点 记下来m行,每行三个数,x,y,c表示x到y的边流量最大为c 这道题的模板来自于网络 http://blog.csdn.net/sprintfwater/article/details/7913061 建议大家去这个页面看看,博主也很良心地添加了很多注释 关于这个模板:Edge为前向星的边数,所以需要初始化Edge和head数组 n表示有n个点,这个版无所谓点从0开始还是从1开始,s表示源点,t表示汇点很好的一个是,这个版的DFS使用的是模拟栈,防止爆栈 1 #

最大流的理解以及dinic模板 poj1273

增广路以及残留网络的定义不再赘述了.算导上说的很清楚,证明也有,看懂了就知道怎么求最大流了. 而算导上提到的FF方法以及ek算法的伪代码中都是将流与残留容量分开储存,其实代码实现的时候我们只需存正反向弧的残留容量即可. 然后是对残留网络的一些理解,残留网络中的反向弧是怎么来的? 残留网络的每条边都是这条有向边的残留容量,而残留容量又由公式cf(u,v)=c(u,v)-f(u,v)得到,那么对于一条不存在的有向边(v,u),其容量c(v,u)=0,f(v,u)=-f(u,v)通过反对称性可知,那么

Dinic 模板

1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 6 using namespace std; 7 const int INF=2147483647; 8 const int maxn=210,maxm=410; 9 int cnt,fir[maxn],nxt[maxm],cap[maxm],to[maxm],dis[maxn]; 10 11

最大流Dinic模板

1 int bfs() 2 { 3 queue<int>q; 4 memset(d,0,sizeof(d)); 5 d[1]=1; 6 q.push(1); 7 while (!q.empty()) 8 { 9 int u=q.front(); 10 q.pop(); 11 for (int i=head[u];i!=-1;i=eage[i].next) 12 { 13 int v=eage[i].v; 14 if (!d[v]&&eage[i].cap>0) 15 {