标签:最小割最大流
代码:
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <cstdio>
#include <string>
#include <bitset>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <map>
#include <set>
#define sss(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a) memset(a,0,sizeof(a))
#define ss(a,b) scanf("%d%d",&a,&b)
#define s(a) scanf("%d",&a)
#define INF 0x3f3f3f3f
#define w(a) while(a)
#define PI acos(-1.0)
#define LL long long
#define eps 10E-9
//#define N 100010<<1
#define mod 1000000000+7
using namespace std;
void mys(int& res)
{
int flag=0;
char ch;
while(!(((ch=getchar())>=‘0‘&&ch<=‘9‘)||ch==‘-‘))
if(ch==EOF) res=INF;
if(ch==‘-‘) flag=1;
else if(ch>=‘0‘&&ch<=‘9‘) res=ch-‘0‘;
while((ch=getchar())>=‘0‘&&ch<=‘9‘) res=res*10+ch-‘0‘;
res=flag?-res:res;
}
void myp(int a)
{
if(a>9)
myp(a/10);
putchar(a%10+‘0‘);
}
/********************the end of template********************/
#define maxn 20010
#define maxm 1000000
struct Eg{
int to;
int next;
int f;
}E[maxm];
int V[maxn],num;
int N,M;
void add(int u,int v,int c){
E[num].to=v;
E[num].f=c;
E[num].next=V[u];
V[u]=num++;
E[num].to=u;
E[num].f=0;
E[num].next=V[v];
V[v]=num++;
}
int level[maxn];
int qu[maxn];
bool BFS(int s,int t){
int i,iq=0;
for(i=0;i<=t;i++) level[i]=0;
int u,v,e;
qu[iq++]=s;
level[s]=1;
for(i=0;i<iq;i++){
u=qu[i];
if(u==t) return true;
for(e=V[u];e!=-1;e=E[e].next){
v=E[e].to;
if(!level[v]&&E[e].f>0)
{
level[v]=level[u]+1;
qu[iq++]=v;
}
}
}
return false;
}
int cur[maxn];
int dfs(int u,int maxf,int t){
if(u==t||maxf==0) return maxf;
int ret=0,f,e,v;
for(e=cur[u];e!=-1;e=E[e].next){// 当前弧优化
v=E[e].to;
if(E[e].f>0&&level[u]+1==level[v]){
f= dfs(v,min(maxf,E[e].f),t);
E[e].f-=f;
E[e^1].f+=f;
maxf-=f;
ret+=f;
cur[u]=e;
if(maxf==0) break;
}
}
return ret;
}
int Dinic(int s,int t){
int flow=0;
while(BFS(s,t)){
for(int i=0;i<=t;i++)
cur[i]=V[i];
flow+=dfs(s,mod,t);
}
return flow;
}
int main(){
int a,b,w;
w(ss(N,M)!=EOF){
for(int i=0;i<=N+1;i++) V[i]=-1;
num=0;
for(int i=1;i<=N;i++){
ss(a,b);
add(0,i,a);
add(i,N+1,b);
}
w(M--){
sss(a,b,w);
add(a,b,w);
add(b,a,w);
}
printf("%d\n",Dinic(0,N+1));
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:最小割最大流
原文地址:http://blog.csdn.net/bigsungod/article/details/47043615