题目链接:Power Network
题意:总共N个点np个发电站,nc个用户,m条边。给出点的链接方式,和边的权值。问从发电站出发最多能有多少电量传到用户。
题解:创建一个源点与所有的发电站建边,创建一个汇点与所有的用户建边,然后求源点到汇点的最大流。
//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include <cstdlib>
#include<queue>
#define min(a,b) a<b?a:b
#define pb push_back
#define ll long long
#define PI 3.14159265
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define eps 1e-7
const int inf=0x7fffffff;
const int maxn=2e2+5;
using namespace std;
int dis[maxn];
int tic[110][110];
int n,np,nc,m;
bool bfs()
{
int s;
memset(dis,0xff,sizeof(dis));
dis[0]=0;
queue<int>q;
q.push(0);
while(!q.empty())
{
s=q.front();q.pop();
for(int i=0;i<=n+1;i++)
{
if(dis[i]<0&&tic[s][i]>0)
{
dis[i]=dis[s]+1;
q.push(i);
}
}
}
if(dis[n+1]>0)return true;
else return false;
}
int dfs(int v,int low)
{
int a;
if(v==n+1)return low;
for(int i=0;i<=n+1;i++)
{
if(tic[v][i]>0&&dis[i]==dis[v]+1&&(a=dfs(i,min(low,tic[v][i]))))
{
tic[v][i]-=a;
tic[i][v]+=a;
return a;
}
}
return 0;
}
int dinic()
{
int ans=0;
while(bfs())
{
int tmp;
while(tmp=dfs(0,inf))
{ans+=tmp;}
}
return ans;
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
while(cin>>n>>np>>nc>>m)
{
memset(tic,0,sizeof(tic));
while(m--)
{
int from,to,c;
char a;
cin>>a>>from>>a>>to>>a>>c;
tic[++from][++to]+=c;
}
while(np--)
{
int from,to,c;
char a;
cin>>a>>from>>a>>c;
tic[0][++from]+=c;
}
while(nc--)
{
int from,to,c;
char a;
cin>>a>>from>>a>>c;
tic[++from][n+1]+=c;
}
cout<<dinic()<<endl;
}
}