题意:给你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; } }
代码: