【最小割】【poj 3469】 Language

来源:互联网 发布:电信光纤网络优化大师 编辑:程序博客网 时间:2024/05/31 05:27

http://poj.org/problem?id=3469


poj上加读入优化慢了2s+hhhhhhhhhhhh


学习了一种新的技术。。。


//#define _TEST _TEST#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <cmath>#include <algorithm>using namespace std;/************************************************Code By willinglive    Blog:http://willinglive.cf************************************************/#define rep(i,l,r) for(int i=(l),___t=(r);i<=___t;i++)#define per(i,r,l) for(int i=(r),___t=(l);i>=___t;i--)#define MS(arr,x) memset(arr,x,sizeof(arr))#define LL long long#define INE(i,u,e) for(int i=head[u];~i;i=e[i].next)inline const int read(){int r=0,k=1;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}/////////////////////////////////////////////////const int N=20100;const int inf=0x3f3f3f3f;int n,m;struct edge{int v,flow,cap,next;}e[2000000];int head[N],k;int S,T;int q[N],d[N],cur[N];int cnt=0;/////////////////////////////////////////////////inline void MIN(int &a,int b){if(a>b)a=b;}inline void adde(int u,int v,int flow){e[k].v=v;e[k].flow=0;e[k].cap=flow;e[k].next=head[u];head[u]=k++;}inline void ins(int u,int v,int f1,int f2){adde(u,v,f1);adde(v,u,f2);}bool bfs_init(){MS(d,-1);d[q[0]=S]=0;for(int u,v,l=0,r=1;l<r;){u=q[l++];INE(i,u,e)if(e[i].flow<e[i].cap && d[v=e[i].v]==-1){q[r++]=v,d[v]=d[u]+1;if(v==T) return 1;}}return 0;}int dinic(){int maxf=0,iter,u;while(bfs_init()){iter=0,u=S;memcpy(cur,head,sizeof(cur));while(cur[S]!=-1){    if(u==T){int minf=inf;per(i,iter-1,0) MIN(minf,e[q[i]].cap-e[q[i]].flow);per(i,iter-1,0){e[q[i]].flow+=minf, e[q[i]^1].flow-=minf;if(e[q[i]].flow==e[q[i]].cap) iter=i;}maxf+=minf; u=e[q[iter]^1].v;}else if(cur[u]!=-1 && e[cur[u]].flow<e[cur[u]].cap && d[u]!=-1 && d[u]+1==d[e[cur[u]].v]){q[iter++] = cur[u]; u = e[cur[u]].v;}else{                while(iter&&u!=S&&cur[u]==-1) u=e[q[--iter]^1].v;                cur[u]=e[cur[u]].next;}}}return maxf;}/////////////////////////////////////////////////void input(){MS(head,-1);scanf("%d%d",&n,&m);    S=0; T=n+1;    int a,b,w;    rep(i,1,n)    {    scanf("%d%d",&a,&b);    ins(S,i,a,0); ins(i,T,b,0);    }    rep(i,1,m)    {    scanf("%d%d%d",&a,&b,&w);    ins(a,b,w,w);    }}void solve(){cout<<dinic()<<endl;}/////////////////////////////////////////////////int main(){    freopen("std.in","r",stdin); freopen("std.out","w",stdout);    input(),solve();    return 0;}


0 0
原创粉丝点击