题意:给你n个点的电网系统,有一些点是电站,能提供p的电能,有些点是用户,能消耗c的电能,有些是过渡站,不消耗不产生(等于没用),然后m条电线(x,y,w),代表x可以向y运输w的电能,问你这个电网系统最多消耗多少电能
解题思路:题目好乱。。。其实就是一个最大流的板子题,电站提供的作为初始流量,用户消耗的和电线运输的代表容量,然后建立一个源点,汇点跑最大流就可以了;也就输入看的烦人;
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cstring>
#define inf 0x3f3f3f3f
#define maxn 100500
using namespace std;
struct Edge
{
int fa;
int next;
int to;
int w;
}edge[maxn];
int n,m;
int head[maxn];
int cnt,Start,End;
int depth[maxn];
void add(int u,int v,int w)
{
edge[cnt].next=head[u];edge[cnt].fa=u;
edge[cnt].to=v;edge[cnt].w=w;head[u]=cnt++;
edge[cnt].next=head[v];edge[cnt].fa=v;
edge[cnt].to=u;edge[cnt].w=0;head[v]=cnt++;
}
bool bfs()//分层;
{
memset(depth,0,sizeof(depth));
queue<int>q;
q.push(Start);
depth[Start]=1;
while(!q.empty())
{
int temp=q.front();
q.pop();
for(int i=head[temp];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(depth[v]||edge[i].w<=0)
continue;
depth[v]=depth[temp]+1;
q.push(v);
}
}
return depth[End];//若为0表示没法到达也就是没有路径了;
}
int dfs(int u,int maxflow)
{
if(u==End)
return maxflow;
int add=0;
for(int i=head[u];i!=-1&&add<maxflow;i=edge[i].next)
{
int v=edge[i].to;
if(depth[v]!=depth[u]+1)
continue;
if(edge[i].w==0)
continue;
int tempflow=dfs(v,min(edge[i].w,maxflow-add));
edge[i].w-=tempflow;
edge[i^1].w+=tempflow;
add+=tempflow;
}
return add;
}
int dinic()
{
int ans=0;
while(bfs())
{
ans+=dfs(Start,0x3f3f3f3f);
}
return ans;
}
int main()
{
int x,y,w;
int np,nc; char s[20];
while(cin>>n>>np>>nc>>m)
{ Start=n+1;End=n+2;
memset(head,-1,sizeof(head));
cnt=0;
for(int i=1;i<=m;i++)
{
cin>>s[1];cin>>x;cin>>s[2];cin>>y;cin>>s[3];cin>>w;
// cout<<x<<y<<w<<endl;
add(x,y,w);
}
for(int i=1;i<=np;i++)
{
cin>>s[1];cin>>x;cin>>s[2];cin>>w;
// cout<<Start<<x<<w<<endl;
add(Start,x,w);
}
for(int i=1;i<=nc;i++)
{
cin>>s[1];cin>>x;cin>>s[2];cin>>w;
// cout<<x<<End<<w<<endl;
add(x,End,w);
}
int ans=dinic();
cout<<ans<<endl;
}
}
代码: