您的位置:首页 > 理论基础 > 计算机网络

poj1459(多源点网络流)

2019-09-24 10:44 1406 查看
原文链接:http://www.cnblogs.com/xiongtao/p/11137771.html

题意:有n个点,np个供电点,nc个消费点,m条线路,接来题目先给出的是m条带权路径,然后是np个供电点和权值,接着就是nc个消费点和权值。 
题目要我们求出给定的图最大能消费的总电量(就是求最大流)

思路:建一个超级源点,一个超级汇点。超级源点连接所以供电站,所以消费点连接超级汇点。跑一遍网络流即可。

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;

struct node{
int c,f;
}mp[310][310];
int sx,ex,n,m,np,nc;
int pre[310];

bool bfs()
{
memset(pre,0,sizeof(pre));
pre[sx]=1;
queue<int> q;
q.push(sx);
while(!q.empty())
{
int p=q.front();
q.pop();
for(int i=0;i<=n+1;i++)
{
if(!pre[i]&&mp

[i].c-mp[p][i].f) { pre[i]=pre[p]+1; q.push(i); } } } return pre[ex]!=0; } int dinic(int pos,int flow) { int f=flow; if(pos==ex) return flow; for(int i=0;i<=n+1;i++) { if(mp[pos][i].c-mp[pos][i].f&&pre[pos]+1==pre[i]) { int a=mp[pos][i].c-mp[pos][i].f; int t=dinic(i,min(a,flow)); mp[pos][i].f+=t; mp[i][pos].f-=t; flow-=t; } } return f-flow; } int solve() { int sum=0; while(bfs()) { sum+=dinic(sx,inf); } return sum; } int main() { while(cin>>n>>np>>nc>>m) { int st,ed,v; char f; sx=n;ex=n+1; memset(mp,0,sizeof(mp)); for(int i=1;i<=m;i++) { cin>>f>>st>>f>>ed>>f>>v; if(st==ed) continue; mp[st][ed].c+=v; } for(int i=1;i<=np;i++) { cin>>f>>st>>f>>v; mp[sx][st].c+=v; } for(int i=1;i<=nc;i++) { cin>>f>>ed>>f>>v; mp[ed][ex].c+=v; } cout<<solve()<<endl; } return 0; }

[p] 

转载于:https://www.cnblogs.com/xiongtao/p/11137771.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: