标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 62078 | Accepted: 23845 |
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
Source
#include<stdio.h> #include<string.h> #include<iostream> #include<queue> #include<algorithm> using namespace std; int edge[300][300];//邻接矩阵 int dis[300];//距源点距离,分层图 int start,end; int m,n;//N:点数;M,边数 int bfs(){ memset(dis,-1,sizeof(dis));//以-1填充 dis[1]=0; queue<int>q; q.push(start); while(!q.empty()){ int u=q.front(); q.pop(); for(int i=1;i<=n;i++){ if(dis[i]<0&&edge[u][i]){ dis[i]=dis[u]+1; q.push(i); } } } if(dis[n]>0) return 1; else return 0;//汇点的DIS小于零,表明BFS不到汇点 } //Find代表一次增广,函数返回本次增广的流量,返回0表示无法增广 int find(int x,int low){//Low是源点到现在最窄的(剩余流量最小)的边的剩余流量 int a=0; if(x==n) return low;//是汇点 for(int i=1;i<=n;i++){ if(edge[x][i]>0&&dis[i]==dis[x]+1&&//联通,,是分层图的下一层 (a=find(i,min(low,edge[x][i])))){//能到汇点(a <> 0) edge[x][i]-=a; edge[i][x]+=a; return a; } } return 0; } int main(){ while(scanf("%d%d",&m,&n)!=EOF){ memset(edge,0,sizeof(edge)); for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); edge[u][v]+=w; } start=1; end=n; int ans=0; while(bfs()){//要不停地建立分层图,如果BFS不到汇点才结束 ans+=find(1,0x7fffffff);//一次BFS要不停地找增广路,直到找不到为止 } printf("%d\n",ans); } return 0; }
poj1273 网络流入门题 dinic算法解决,可作模板使用
标签:
原文地址:http://www.cnblogs.com/13224ACMer/p/4695423.html