【POJ 1459 power network】

來源:互聯網
上載者:User

標籤:isa   ons   時間   print   next   tin   display   cstring   closed   

不可以理解的是,測評站上的0ms是怎麼搞出來的。

這一題在建立超級源點和超級匯點後就變得溫和可愛了。其實它本身就溫和可愛。對比了能夠找到的題解:

(1)艾德蒙·卡普演算法(2)迪尼克演算法(3)改進版艾德蒙·卡普演算法(MY METHOD)

不去管那個0ms的吧,那麼(3)號演算法最為美妙【它的別名是:ISAP】,時間客觀。

這個就算是一個ISAP的模板吧(除了輸入的難看的幾行外,其餘均是標準的大米餅牌模板!)

 1 #include<stdio.h> 2 #include<algorithm> 3 #include<queue> 4 #include<cstring> 5 #define go(i,a,b) for(int i=a;i<=b;i++) 6 #define fo(i,a,x) for(int i=a[x],v=e[i].v;i>-1;i=e[i].next,v=e[i].v) 7 #define mem(a,b) memset(a,b,sizeof(a)) 8 using namespace std;const int N=5000; 9 struct E{int v,next,flow,cap;}e[N*N];10 int n,n_power,n_user,m,S,T,head[N],k=0,d[N];11 int num[N],cur[N],preE[N],preN[N];12 void ADD(int u,int v,int flow,int cap){e[k]=(E){v,head[u],flow,cap};head[u]=k++;}13 void BFS()14 {15     queue<int>q;bool vis[N]={0};q.push(T);d[T]=0;16     while(!q.empty())17     {18         int u=q.front();q.pop();19         fo(i,head,u)if(!e[i].cap&&!vis[v])20         vis[v]=1,d[v]=d[u]+1,q.push(v);    21     }22 }23 int aug(){int u,a=2147483645;24     u=T;while(u!=S){int i=preE[u];a=min(a,e[i].cap-e[i].flow);u=preN[u];}25     u=T;while(u!=S){int i=preE[u];e[i].flow+=a;e[i^1].flow-=a;u=preN[u];}return a;}26 int main(){while(~scanf("%d%d%d%d",&n,&n_power,&n_user,&m))27 {    28     S=0;T=n+1;char _;mem(head,-1);29     go(i,1,m){int u,v,cap;scanf(" %c%d%c%d%c%d",&_,&u,&_,&v,&_,&cap);30     u++,v++;ADD(u,v,0,cap);ADD(v,u,0,0);}31     go(i,1,n_power){int v,cap;scanf(" %c%d%c%d",&_,&v,&_,&cap);32     v++;ADD(S,v,0,cap);ADD(v,S,0,0);}33     go(i,1,n_user){int u,cap;scanf(" %c%d%c%d",&_,&u,&_,&cap);34     u++;ADD(u,T,0,cap);ADD(T,u,0,0);}BFS();mem(num,0);35         36     go(i,0,n+1)num[d[i]]++,cur[i]=head[i];37     int u=S,flow=0;38     while(d[S]<T+1)39     {40         u==T?flow+=aug(),u=S:1;bool retreat=1;41         fo(i,cur,u)    if(e[i].cap>e[i].flow&&d[u]==d[v]+1)42         {retreat=0;cur[u]=preE[v]=i;preN[v]=u;u=v;break;}43 44         if(!retreat)continue;45             46         int Min=T;fo(i,head,u){if(e[i].cap>e[i].flow)Min=min(Min,d[v]);}47         if(!(--num[d[u]]))break;num[d[u]=Min+1]++;48         cur[u]=head[u];u==S?1:u=preN[u];49     }50     printf("%d\n",flow);51 }return 0;}//Paul_Guderian
【改進版艾德蒙·卡普演算法】

網路流兩個學習要點:學會轉化問題,學會幾個模型?你是在質疑神奇大米餅的權威嗎?那就給你個大米餅!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ZBH不給我玩以撒的結合…我寫了這篇部落格來表達憤怒!

【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.