POJ 1273 && 3469 【最大流】

来源:互联网 发布:淘宝新开店铺采集 编辑:程序博客网 时间:2024/05/22 10:46

1273 

裸最大流

【史上最优模版】

/* ***********************************************Author        :angon************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <stack>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)#define lld %I64d#define REP(i,k,n) for(int i=k;i<n;i++)#define REPP(i,k,n) for(int i=k;i<=n;i++)#define scan(d) scanf("%d",&d)#define scanl(d) scanf("%I64d",&d)#define scann(n,m) scanf("%d%d",&n,&m)#define scannl(n,m) scanf("%I64d%I64d",&n,&m)#define mst(a,k)  memset(a,k,sizeof(a))#define LL long long#define N 1005#define mod 1000000007inline int read(){int s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}const int MAXN=210;const int MAXM=410;const int INF=0x3f3f3f3f;struct Node{    int to,next,cap;}edge[MAXM];int tol;int head[MAXN];int gap[MAXN],dis[MAXN],pre[MAXN],cur[MAXN];void init(){    tol=0;    memset(head,-1,sizeof(head));}void addedge(int u,int v,int w,int rw=0)  //单向边的话不用管rw{    edge[tol].to=v;edge[tol].cap=w;edge[tol].next=head[u];head[u]=tol++;    edge[tol].to=u;edge[tol].cap=rw;edge[tol].next=head[v];head[v]=tol++;}int sap(int start,int End,int nodenum)  //源点、汇点、点的个数{    memset(dis,0,sizeof(dis));    memset(gap,0,sizeof(gap));    memcpy(cur,head,sizeof(head));    int u=pre[start]=start,maxflow=0,aug=-1;    gap[0]=nodenum;    while(dis[start]<nodenum)    {        loop:        for(int &i=cur[u];i!=-1;i=edge[i].next)        {            int v=edge[i].to;            if(edge[i].cap&&dis[u]==dis[v]+1)            {                if(aug==-1||aug>edge[i].cap)                    aug=edge[i].cap;                pre[v]=u;                u=v;                if(v==End)                {                    maxflow+=aug;                    for(u=pre[u];v!=start;v=u,u=pre[u])                    {                        edge[cur[u]].cap-=aug;                        edge[cur[u]^1].cap+=aug;                    }                    aug=-1;                }                goto loop;            }        }        int mindis=nodenum;        for(int i=head[u];i!=-1;i=edge[i].next)        {            int v=edge[i].to;            if(edge[i].cap&&mindis>dis[v])            {                cur[u]=i;                mindis=dis[v];            }        }        if((--gap[dis[u]])==0)break;        gap[dis[u]=mindis+1]++;        u=pre[u];    }    return maxflow;}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int n,m,u,v,w;    while(~scann(n,m))    {        init();        REP(i,0,n)        {            scann(u,v); scan(w);            addedge(u,v,w);        }        printf("%d\n",sap(1,m,m));    }    return 0;}

3469

转化为最大流

先找两个没出现的点s,t 作为源点和汇点

连n条 <s,i>的边 

n条<i,t>的边

m*2条<a , b>,<b , a>边

既是求s,t的最大流

【模版大法好】

/* ***********************************************Author        :angon************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <stack>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)#define lld %I64d#define REP(i,k,n) for(int i=k;i<n;i++)#define REPP(i,k,n) for(int i=k;i<=n;i++)#define scan(d) scanf("%d",&d)#define scanl(d) scanf("%I64d",&d)#define scann(n,m) scanf("%d%d",&n,&m)#define scannl(n,m) scanf("%I64d%I64d",&n,&m)#define mst(a,k)  memset(a,k,sizeof(a))#define LL long long#define N 1005#define mod 1000000007inline int read(){int s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}const int MAXN=20010;const int MAXM=2000005;const int INF=0x3f3f3f3f;struct Node{    int to,next,cap;}edge[MAXM];int tol;int head[MAXN];int gap[MAXN],dis[MAXN],pre[MAXN],cur[MAXN];void init(){    tol=0;    memset(head,-1,sizeof(head));}void addedge(int u,int v,int w,int rw=0)  //单向边的话不用管rw{    edge[tol].to=v;edge[tol].cap=w;edge[tol].next=head[u];head[u]=tol++;    edge[tol].to=u;edge[tol].cap=rw;edge[tol].next=head[v];head[v]=tol++;}int sap(int start,int End,int nodenum)  //源点、汇点、点的个数{    memset(dis,0,sizeof(dis));    memset(gap,0,sizeof(gap));    memcpy(cur,head,sizeof(head));    int u=pre[start]=start,maxflow=0,aug=-1;    gap[0]=nodenum;    while(dis[start]<nodenum)    {        loop:        for(int &i=cur[u];i!=-1;i=edge[i].next)        {            int v=edge[i].to;            if(edge[i].cap&&dis[u]==dis[v]+1)            {                if(aug==-1||aug>edge[i].cap)                    aug=edge[i].cap;                pre[v]=u;                u=v;                if(v==End)                {                    maxflow+=aug;                    for(u=pre[u];v!=start;v=u,u=pre[u])                    {                        edge[cur[u]].cap-=aug;                        edge[cur[u]^1].cap+=aug;                    }                    aug=-1;                }                goto loop;            }        }        int mindis=nodenum;        for(int i=head[u];i!=-1;i=edge[i].next)        {            int v=edge[i].to;            if(edge[i].cap&&mindis>dis[v])            {                cur[u]=i;                mindis=dis[v];            }        }        if((--gap[dis[u]])==0)break;        gap[dis[u]=mindis+1]++;        u=pre[u];    }    return maxflow;}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int n,m,u,v,w;    while(~scann(n,m))    {        int s = n + 1, t = n + 2;        init();        REPP(i,1,n)        {            scann(u,v);            addedge(s,i,u);            addedge(i,t,v);        }        REPP(i,1,m)        {            scann(u,v); scan(w);            addedge(u,v,w);            addedge(v,u,w);        }        printf("%d\n",sap(s,t,n+2));    }    return 0;}


0 0
原创粉丝点击