标签:term points through oid nic ace sig hose body
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 78671 | Accepted: 30687 |
Description
Input
Output
Sample Input
5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10
Sample Output
50
题解
网络流模板题。。。
dinic求最大流
代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define inf 1<<30 using namespace std; struct edge{ int to,ne,cap; }e[400005]; int n,m,s,t,a,b,c,ans,ecnt; int head[10005],layer[10005]; queue<int> q; void add(int x,int y,int z) { e[++ecnt].to=y;e[ecnt].cap=z;e[ecnt].ne=head[x];head[x]=ecnt; e[++ecnt].to=x;e[ecnt].cap=0;e[ecnt].ne=head[y];head[y]=ecnt; } bool bfs() { //while(!q.empty())q.pop(); q.push(s); for(int i=0;i<=m;++i)layer[i]=0; layer[s]=1; while(!q.empty()) { int d=q.front(); q.pop(); for(int i=head[d];i;i=e[i].ne) { int dd=e[i].to; if(e[i].cap>0&&layer[dd]==0) { layer[dd]=layer[d]+1; q.push(dd); } } } return layer[t]; } int dfs(int x,int val) { if(val==0||x==t)return val; int ret=0; for(int i=head[x];i;i=e[i].ne) { int dd=e[i].to; if(e[i].cap>0&&layer[dd]==layer[x]+1) { int tmp=dfs(dd,min(val,e[i].cap)); ret+=tmp; val-=tmp; e[i].cap-=tmp; e[(i-1)^1+1].cap+=tmp; } } return ret; } void dinic() { while(bfs()) { ans+=dfs(s,inf); } } int main() { while(~scanf("%d%d",&n,&m)) { ecnt=0;ans=0; memset(head,0,sizeof(head)); for(int i=1;i<=n;++i) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); } s=1;t=m; dinic(); printf("%d\n",ans); } }
标签:term points through oid nic ace sig hose body
原文地址:http://www.cnblogs.com/rir1715/p/7761462.html