萌萌的網路流~~

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   io   for   ar   art   

上下界網路流:

  sgu 194 (無源匯的上下界網路流):

  題意:給出一個網路,每條邊有上下界,問是否存在可行流。如果存在,輸出經過每條邊的流量。

  建圖:每條邊必須有li的流量,那麼建立超級源點和超級匯點,然後統計每個點的“入度”和“出度”,然後源點和每個點建一條流量為“入度”的邊,每個點和匯點建一條流量為“出度”的邊。為了流量平衡,每條邊取原有上界-原有下界為流量,然後加入網路。(還有種做法是每個點統計出度和入度,判斷是正是負來決定它和源點還是匯點建邊。這種做法運行效率更高一些。)

  題目給的圖因為沒有源點和匯點,所以我覺得統計最大流是沒有意義的。對於我們自己建的圖,判斷一下每條邊的下界的和是否等於最大流,以此來判定是否有可行流就行了。

 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <cstring> 6 #include <ctime> 7 #define FORD(i,r,l) for(int i=(r);i>=(l);i--) 8 #define rep(i,n) for(int i=0;i<(n);i++) 9 #define req(i,l,n) for(int i=(l);i<(n);i++)10 using namespace std;11 typedef long long LL;12 const int maxn=205+1,maxm=120000;13 const LL jx=0x7fffffffffffffff;14 15 int pos,ta[maxn],lin[maxm],sd[maxm],sl[maxm];16 void biu(int s,int t,int c)17 {18     ++pos; lin[pos]=ta[s]; ta[s]=pos; sd[pos]=t; sl[pos]=c;19     ++pos; lin[pos]=ta[t]; ta[t]=pos; sd[pos]=s; sl[pos]=0;20 }21 22 int nn;23 int h[maxn];24 int vh[maxn];25 int aug(int v,int deta)26 {27     if (v==nn) return deta;28     int mins=nn-1,augc,bak=deta;29     for (int i=ta[v];i;i=lin[i])30         if (sl[i])31         {32             if (h[v]==h[sd[i]]+1)33             {34                 augc=min(deta,sl[i]);35                 augc=aug(sd[i],augc);36                 deta-=augc;37                 sl[i]-=augc; sl[(i+1^1)-1]+=augc;38                 if (!deta) break;39                 if (h[nn-1]>=nn) return bak-deta;40             }41             mins=min(mins,h[sd[i]]);42         }43     if (bak==deta)44     {45         vh[h[v]]--; if (vh[h[v]]==0) h[nn-1]=nn;46         h[v]=mins+1; vh[h[v]]++;47     }48     return bak-deta;49 }50 51 int n,m;52 int rd[201],cd[201];53 int pipel[maxm];54 int main(){55     scanf("%d%d",&n,&m);56     int u,v,l,c;57     for (int i=1;i<=m;i++)58     {59         scanf("%d%d%d%d",&u,&v,&l,&c);60         pipel[i]=l;61         rd[v]+=l; cd[u]+=l;62         biu(u,v,c-l);63     }64     nn=n+2;//--65     LL sum=0;66     for (int i=1;i<=n;i++)67     {68         if (rd[i]) biu(nn-1,i,rd[i]);69         if (cd[i]) biu(i,nn,cd[i]);70         sum+=rd[i];71     }72     LL flow=0;73     while (h[nn-1]<nn) flow+=aug(nn-1,0x7fffffff);74     if (sum!=flow) puts("NO\n");75     else76     {77         puts("YES");78         for (int i=1;i<=m;i++) printf("%d\n",pipel[i]+sl[i*2]);79     }80     return 0;81 }
View Code

  (提示:如果第7個點WA了,說明你沒開long long或者數組範圍沒夠。)

萌萌的網路流~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.