POJ - 1459 Power Network(网络流-最大流)
題目鏈接:點(diǎn)擊查看
題目大意:題意屬實(shí)惡心,借用別的大佬的題意:
題目描述
一個(gè)電網(wǎng)包含一些結(jié)點(diǎn)(電站、消費(fèi)者、調(diào)度站),這些結(jié)點(diǎn)通過(guò)電線(xiàn)連接。每個(gè)結(jié)點(diǎn) uu 可能被供給 s(u) 的電能, s(u)≥0 ,同時(shí)也可能產(chǎn)生 p(u)的電能, 0≤p(u)≤pmax(u),站點(diǎn) u 還有可能 消費(fèi) c(u) 電能, 0≤c(u)≤min(s(u),cmax(u)),可能傳輸 d(u)的電能, d(u)=s(u)+p(u)?c(u) 。
以上這些量存在以下限制關(guān)系:
對(duì)每個(gè)電站, c(u)=0 。對(duì)每個(gè)消費(fèi)者, p(u)=0 。對(duì)每個(gè)調(diào)度站, p(u)=c(u)=0 。
在電網(wǎng)中兩個(gè)結(jié)點(diǎn) u?和 v?之間最多有一條電線(xiàn)連接。從結(jié)點(diǎn) u?到結(jié)點(diǎn) v 傳輸 L(u,v) 的電能, 0≤L(u,v)≤Lmax(u,v) 。定義 Con 為 c(u) 的總和,表示電網(wǎng)中消費(fèi)電能的總和。本題的目的是求 Con 的最大值。
在圖(a)中,電站結(jié)點(diǎn) u?的標(biāo)記” x/y ”代表 p(u)=x 、 pmax(u)=y 。消費(fèi)者結(jié)點(diǎn) u 的標(biāo)記” x/y ”代表 c(u)=x 、 cmax(u)=y 。每條電線(xiàn)所對(duì)應(yīng)的邊 (u,v) ,其標(biāo)記” x/y ” 代表 L(u,v)=x 、 Lmax(u,v)=y 。
在圖(b)中,消費(fèi)的最大電能 Con=6 ,圖(a)列出了在此狀態(tài)下各 個(gè)站點(diǎn)的 s(u)?、 p(u) 、 c(u) 和 d(u) 。注意,如圖(b)所示的電網(wǎng)中,電能的流動(dòng)還存在其他狀態(tài),但 消費(fèi)的電能總和不超過(guò)6。
輸入描述
輸入文件中包含多個(gè)測(cè)試數(shù)據(jù),每個(gè)測(cè)試數(shù)據(jù)描述了一個(gè)電網(wǎng)。每個(gè)測(cè)試數(shù)據(jù)的第1 行為4 個(gè)整數(shù): n,np,nc,m ,其中, 0≤n≤100 ,代表結(jié)點(diǎn)數(shù)目; 0≤np≤n ,代表電站數(shù)目; 0≤nc≤n , 代表消費(fèi)者數(shù)目; 0≤m≤n2 ,代表傳輸電線(xiàn)的數(shù)目。接下來(lái)有 m?個(gè)三元組, (u,v)z ,其中 u?和 v?為結(jié)點(diǎn)序號(hào)(結(jié)點(diǎn)序號(hào)從0開(kāi)始計(jì)起), 0≤z≤1000 ,代表 Lmax(u,v) 的值。接下來(lái)有 npnp 個(gè)二元 組, (u)z ,其中 u?為電站結(jié)點(diǎn)的序號(hào), 0≤z≤10000 ,代表 pmax(u) 的值;每個(gè)測(cè)試數(shù)據(jù)的最后是 nc 個(gè)二元組, (u)z ,其中 u?為消費(fèi)者結(jié)點(diǎn)的序號(hào), 0≤z≤10000 ,代表 cmax(u) 的值。所有數(shù)據(jù)都是整數(shù)。除三元組 (u,v)z 和二元組 (u)z 中不含空格外,輸入文件中其他位置允許出現(xiàn)空格。測(cè)試數(shù)據(jù)一直到文件末尾。
題目分析:看懂題意之后,其實(shí)就是個(gè)簡(jiǎn)單的網(wǎng)絡(luò)流求最大流的模板題,簡(jiǎn)單說(shuō)一下題意就是,給出三種點(diǎn):
然后個(gè)點(diǎn)之間由m條邊連接,我們可以視為電線(xiàn),每根電線(xiàn)都有一定的電流量,也就是最多只能通多那么多單位的電,現(xiàn)在給出每個(gè)發(fā)電站發(fā)的電,以及每個(gè)消費(fèi)者用的電,問(wèn)消費(fèi)者總共最多能用多少電
其實(shí)只需要建一個(gè)超級(jí)源點(diǎn)指向每一個(gè)發(fā)電站,再建一個(gè)超級(jí)匯點(diǎn),收集所有的消費(fèi)者,對(duì)于st和ed跑一遍最大流就ok了,注意輸入的時(shí)候有點(diǎn)惡心
代碼:
#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];//邊數(shù)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;//反向邊邊權(quán)設(shè)置為0edge[cnt].next=head[v];head[v]=cnt++; }int d[N],now[N*N];//深度 當(dāng)前弧優(yōu)化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; }?
總結(jié)
以上是生活随笔為你收集整理的POJ - 1459 Power Network(网络流-最大流)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CodeForces - 1263A S
- 下一篇: CodeForces - 1255D F