洛谷P3376 【模板】网络最大流
题目描述
如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。
输入输出格式
输入格式:
第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。
接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)
输出格式:
一行,包含一个正整数,即为该网络的最大流。
输入输出样例
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=10,M<=25
对于70%的数据:N<=200,M<=1000
对于100%的数据:N<=10000,M<=100000
样例说明:
题目中存在3条路径:
4-->2-->3,该路线可通过20的流量
4-->3,可通过20的流量
4-->2-->1-->3,可通过10的流量(边4-->2之前已经耗费了20的流量)
故流量总计20+20+10=50。输出50。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 const int maxn=1e4+10; 6 const int maxm=1e5+10; 7 int n,m,S,T,tot=1; 8 int head[maxn],p[maxn],dis[maxn],q[maxn*2]; 9 bool vis[maxn]; 10 long long read() 11 { 12 long long x=0,f=1; 13 char ch=getchar(); 14 while(ch>'9'||ch<'0') 15 { 16 if(ch=='-') 17 f=-1; 18 ch=getchar(); 19 } 20 while(ch>='0'&&ch<='9') 21 { 22 x=x*10+ch-'0'; 23 ch=getchar(); 24 } 25 return x*f; 26 } 27 struct node 28 { 29 int v,next,cap,flow; 30 } e[maxm<<1]; 31 void add(int x,int y,int z) 32 { 33 e[++tot]=(node) 34 { 35 y,head[x],z,0 36 }; 37 head[x]=tot; 38 e[++tot]=(node) 39 { 40 x,head[y],0,0 41 }; 42 head[y]=tot; 43 } 44 bool bfs() 45 { 46 int h=0,t=1; 47 memset(dis,-1,sizeof(dis)); 48 dis[S]=0; 49 q[1]=S; 50 while(h!=t) 51 { 52 int x=q[++h]; 53 for(int i=head[x]; i; i=e[i].next) 54 { 55 int v=e[i].v; 56 if(dis[v]==-1&&e[i].cap>e[i].flow) 57 { 58 dis[v]=dis[x]+1; 59 q[++t]=v; 60 } 61 } 62 } 63 return dis[T]!=-1; 64 } 65 int dfs(int x,int f) 66 { 67 if(x==T||!f) 68 return f; 69 int used=0,f1; 70 for(int &i=p[x]; i; i=e[i].next) 71 { 72 if(dis[x]+1==dis[e[i].v]&&(f1=dfs(e[i].v,min(f,e[i].cap-e[i].flow)))>0) 73 { 74 e[i].flow+=f1; 75 e[i^1].flow-=f1; 76 used+=f1; 77 f-=f1; 78 if(!f) 79 break; 80 } 81 } 82 return used; 83 } 84 int dinic() 85 { 86 int ans=0; 87 while(bfs()) 88 { 89 for(int i=1; i<=n; i++) 90 p[i]=head[i]; 91 ans+=dfs(S,0x7fffffff); 92 } 93 return ans; 94 } 95 int main() 96 { 97 n=read(),m=read(),S=read(),T=read(); 98 for(int i=1; i<=m; i++) 99 { 100 int x,y,z; 101 x=read(),y=read(),z=read(); 102 add(x,y,z); 103 } 104 printf("%d",dinic()); 105 return 0; 106 }