POJ - 1459 Power Network(网络流-最大流)
題目鏈接:點擊查看
題目大意:題意屬實惡心,借用別的大佬的題意:
題目描述
一個電網包含一些結點(電站、消費者、調度站),這些結點通過電線連接。每個結點 uu 可能被供給 s(u) 的電能, s(u)≥0 ,同時也可能產生 p(u)的電能, 0≤p(u)≤pmax(u),站點 u 還有可能 消費 c(u) 電能, 0≤c(u)≤min(s(u),cmax(u)),可能傳輸 d(u)的電能, d(u)=s(u)+p(u)?c(u) 。
以上這些量存在以下限制關系:
對每個電站, c(u)=0 。對每個消費者, p(u)=0 。對每個調度站, p(u)=c(u)=0 。
在電網中兩個結點 u?和 v?之間最多有一條電線連接。從結點 u?到結點 v 傳輸 L(u,v) 的電能, 0≤L(u,v)≤Lmax(u,v) 。定義 Con 為 c(u) 的總和,表示電網中消費電能的總和。本題的目的是求 Con 的最大值。
在圖(a)中,電站結點 u?的標記” x/y ”代表 p(u)=x 、 pmax(u)=y 。消費者結點 u 的標記” x/y ”代表 c(u)=x 、 cmax(u)=y 。每條電線所對應的邊 (u,v) ,其標記” x/y ” 代表 L(u,v)=x 、 Lmax(u,v)=y 。
在圖(b)中,消費的最大電能 Con=6 ,圖(a)列出了在此狀態下各 個站點的 s(u)?、 p(u) 、 c(u) 和 d(u) 。注意,如圖(b)所示的電網中,電能的流動還存在其他狀態,但 消費的電能總和不超過6。
輸入描述
輸入文件中包含多個測試數據,每個測試數據描述了一個電網。每個測試數據的第1 行為4 個整數: n,np,nc,m ,其中, 0≤n≤100 ,代表結點數目; 0≤np≤n ,代表電站數目; 0≤nc≤n , 代表消費者數目; 0≤m≤n2 ,代表傳輸電線的數目。接下來有 m?個三元組, (u,v)z ,其中 u?和 v?為結點序號(結點序號從0開始計起), 0≤z≤1000 ,代表 Lmax(u,v) 的值。接下來有 npnp 個二元 組, (u)z ,其中 u?為電站結點的序號, 0≤z≤10000 ,代表 pmax(u) 的值;每個測試數據的最后是 nc 個二元組, (u)z ,其中 u?為消費者結點的序號, 0≤z≤10000 ,代表 cmax(u) 的值。所有數據都是整數。除三元組 (u,v)z 和二元組 (u)z 中不含空格外,輸入文件中其他位置允許出現空格。測試數據一直到文件末尾。
題目分析:看懂題意之后,其實就是個簡單的網絡流求最大流的模板題,簡單說一下題意就是,給出三種點:
然后個點之間由m條邊連接,我們可以視為電線,每根電線都有一定的電流量,也就是最多只能通多那么多單位的電,現在給出每個發電站發的電,以及每個消費者用的電,問消費者總共最多能用多少電
其實只需要建一個超級源點指向每一個發電站,再建一個超級匯點,收集所有的消費者,對于st和ed跑一遍最大流就ok了,注意輸入的時候有點惡心
代碼:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=210;struct Edge {int to,w,next; }edge[N*N];//邊數int head[N],cnt;void addedge(int u,int v,int w) {edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;//反向邊邊權設置為0edge[cnt].next=head[v];head[v]=cnt++; }int d[N],now[N*N];//深度 當前弧優化bool bfs(int s,int t)//尋找增廣路 {memset(d,0,sizeof(d));queue<int>q;q.push(s);now[s]=head[s];d[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(d[v])continue;if(!w)continue;d[v]=d[u]+1;now[v]=head[v];q.push(v);if(v==t)return true;}}return false; }int dinic(int x,int t,int flow)//更新答案 {if(x==t)return flow;int rest=flow,i;for(i=now[x];i!=-1&&rest;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(w&&d[v]==d[x]+1){int k=dinic(v,t,min(rest,w));if(!k)d[v]=0;edge[i].w-=k;edge[i^1].w+=k;rest-=k;}}now[x]=i;return flow-rest; }void init() {memset(head,-1,sizeof(head));cnt=0; }int solve(int st,int ed) {int ans=0,flow;while(bfs(st,ed))while(flow=dinic(st,ed,inf))ans+=flow;return ans; }int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int n,np,nc,m;while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF){init();while(m--){int a,b,c;while(getchar()!='(');scanf("%d%*c%d%*c%d",&a,&b,&c);addedge(a,b,c);}while(np--){int a,b;while(getchar()!='(');scanf("%d%*c%d",&a,&b);addedge(n,a,b);}while(nc--){int a,b;while(getchar()!='(');scanf("%d%*c%d",&a,&b);addedge(a,n+1,b);}printf("%d\n",solve(n,n+1));}return 0; }?
總結
以上是生活随笔為你收集整理的POJ - 1459 Power Network(网络流-最大流)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 1263A S
- 下一篇: CodeForces - 1255D F