标签:push div col 标示 cost 初始 return 出队 source
#define Max 250 #define INF 0x3f3f3f3f int map[Max][Max]; int max_flow(int num,int map[][Max],int source,int sink)//参数含义:结点数量 网络 源点 汇点 { int pre[Max],min_flow[Max];//记录结点的父节点 当前路径中最小的一段的值,也即限制值 int flow[Max][Max];//记录当前网络中的流 int ans = 0 ;//最终结果 memset(flow,0,sizeof(flow)); while(1)//一直循环,直到不存在增广路径 { queue<int> q; memset(pre,-1,sizeof(pre)); q.push(source); pre[source] = -2;//源点的父节点需特殊标示 min_flow[source] = INF; while(!q.empty())//BFS寻找增广路径 { int temp = q.front();//出队列 q.pop(); for(int i = 0 ; i < num ; i++)//由结点temp往外扩展 { if(pre[i] == -1 && flow[temp][i] < map[temp][i]) //当结点i还未被探索到,并且还有可用流量 { q.push(i);//加入队列 pre[i] = temp;//标示父节点 min_flow[i] = min(min_flow[temp],map[temp][i]-flow[temp][i]);//求得min_flow } } if(pre[sink]!=-1)//sink的父节点不为初始值,说明BFS已经找到了一条路径 { int k = sink; while(pre[k] >= 0) { flow[pre[k]][k] +=min_flow[sink];//将新的流量加入flow flow[k][pre[k]] -=min_flow[sink]; k = pre[k]; } break; } } if(pre[sink] != -1) ans+=min_flow[sink]; else return ans;//不存在增广路径,返回 } } int main() { int m,n;//n流通数,m为节点数量 while(scanf("%d%d",&n,&m)!=EOF) { int a,b,cost; memset(map,0,sizeof(map)); for(int i=0;i<n;i++) { scanf("%d%d%d",&a,&b,&cost); map[a-1][b-1]+=cost;//网络 } printf("%d\n",max_flow(m,map,0,m-1)); } return 0; }
标签:push div col 标示 cost 初始 return 出队 source
原文地址:https://www.cnblogs.com/ww123/p/9523468.html