POJ 1459 Power Network

來源:互聯網
上載者:User

標籤:string   ++   size   大網   edm   ret   添加   queue   節點   

題意:有n個據點,np個發電機。nc個使用者,m條電線。給出發電機。使用者。電線的電流限制,求最大網路電流。

這是帶節點的網路流。事實上和原來沒什麼差別,僅僅要在前後都添加一個據點,在這裡我加了0和n+1兩個節點,而發電機節點的電流限制能夠

轉化為0->節點的電流限制,使用者節點電流的限制能夠轉化為節點->n+1的電流限制,之後套用最大網路流模板就可以。這裡我寫了,Edmonds_karp演算法。

稍後傳上Dinic演算法。。。

。。。。。。。。。。。。。

。。



AC代碼例如以下:


Edmonds_karp演算法


#include <iostream>#include <cstdio>#include <queue>#include <cstring>#define min(a,b) (a<b?a:b)#define inf 100000000using namespace std;int n,np,nc,m;int map[105][105],jd[105],p[105],f[105];int Edmonds_karp(int s,int e){    int i,j;    queue <int > q;    int a,b;    for(i=0;i<=n+1;i++)        p[i]=-1;    f[0]=inf;    q.push(s);    while(!q.empty())    {        b=q.front ();        q.pop();        if(b==e)            break;        for(i=0;i<=n+1;i++)        {            if(p[i]==-1&&map[b][i]>0)            {                f[i]=min(map[b][i],f[b]);                p[i]=b;                q.push(i);            }        }    }    if(p[e]==-1)        return -1;    else return f[e];}int maxflow(int s,int e){    int i,j;    int a,ans=0;    a=Edmonds_karp(s,e);    while(a!=-1)    {        int k=e,min=inf;        while(k!=s)        {            map[p[k]][k]-=a;            map[k][p[k]]+=a;            k=p[k];        }        ans+=a;        a=Edmonds_karp(s,e);    }    return ans;}int main(){    int i,j;    int a,b,c,d,f;    char z,x,y;    while(cin>>n>>np>>nc>>m)    {        memset(map,0,sizeof map);        for(i=1;i<=m;i++)        {            cin>>z>>a>>x>>b>>y>>c;            map[a+1][b+1]+=c;        }        for(i=1;i<=np;i++)        {            cin>>z>>d>>x>>f;            map[0][d+1]+=f;        }        for(i=1;i<=nc;i++)        {            cin>>z>>d>>x>>f;            map[d+1][n+1]+=f;        }        cout<<maxflow(0,n+1)<<endl;    }    return 0;}

Dinic演算法

#include<iostream>#include<cstdio>#include<cstring>#include<queue>#define inf 100000000#define min(a,b) (a<b?a:b)using namespace std;int n,np,nc,m;int map[105][105],cs[105];int bfs(){    int i,j;    queue <int > q;    int a,b;    memset(cs,-1,sizeof cs);    cs[0]=0;    q.push(0);    while(!q.empty())    {        b=q.front ();        q.pop();        for(i=0;i<=n+1;i++)        {            if(cs[i]==-1&&map[b][i]>0)            {                cs[i]=cs[b]+1;                q.push(i);            }        }    }    if(cs[n+1]==-1)        return 0;    else return 1;}int dfs(int s,int mf){    int i,j;    int a,b;    if(s==n+1)        return mf;    for(i=0;i<=n+1;i++)    {        if(cs[i]==cs[s]+1&&map[s][i]>0&&(a=dfs(i,min(mf,map[s][i]))))        {            map[s][i]-=a;            map[i][s]+=a;            return a;        }    }    return 0;}int main(){    int i,j;    int a,b,c,d,f;    while(cin>>n>>np>>nc>>m)    {        memset(map,0,sizeof map);        for(i=1;i<=m;i++)        {            scanf(" (%d,%d)%d",&a,&b,&c);            map[a+1][b+1]+=c;        }        for(i=1;i<=np;i++)        {            scanf(" (%d)%d",&d,&f);            map[0][d+1]+=f;        }        for(i=1;i<=nc;i++)        {            scanf(" (%d)%d",&d,&f);            map[d+1][n+1]+=f;        }        int ans=0,sum;        while(bfs())        {            while(sum=dfs(0,inf))                ans+=sum;        }        cout<<ans<<endl;    }    return 0;}

POJ 1459 Power Network

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.