poj1459(Power Network)

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   os   

題目地址:Power Network

題目大意:

     輸入分別為m個點,a個發電站,b個使用者,n條邊;接下去是n條邊的資訊(u,v)cost,cost表示邊(u,v)的最大流量;a個發電站的資訊(u)cost,cost表示發電站u能提供的最大流量;b個使用者的資訊(v)cost,cost表示每個使用者v能接受的最大流量。

    求發電站流向使用者的最大流量。

解題思路:

    最大流問題

 

,首先建圖,我讓m+1這個節點為源點S,讓m這個點為匯點T。求流入T的最大流即可。

 

代碼:

  1 #include <algorithm>  2 #include <iostream>  3 #include <sstream>  4 #include <cstdlib>  5 #include <cstring>  6 #include <cstdio>  7 #include <string>  8 #include <bitset>  9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <list> 14 //#include <map> 15 #include <set> 16 using namespace std; 17 /***************************************/ 18 #define ll long long 19 #define int64 __int64 20 /***************************************/ 21 const int INF = 0x7f7f7f7f; 22 const double eps = 1e-8; 23 const double PIE=acos(-1.0); 24 const int d1x[]= {-1,1,0,0}; 25 const int d1y[]= {0,0,-1,1}; 26 const int d2x[]= {0,-1,0,1}; 27 const int d2y[]= {1,0,-1,0}; 28 const int fx[]= {-1,-1,-1,0,0,1,1,1}; 29 const int fy[]= {-1,0,1,-1,1,-1,0,1}; 30 /***************************************/ 31 void openfile() 32 { 33     freopen("data.in","rb",stdin); 34     freopen("data.out","wb",stdout); 35 } 36 /**********************華麗麗的分割線,以上為模板部分*****************/ 37 #define arraysize 201 38 int maxData = 0x7fffffff; 39 int map[arraysize][arraysize]; //記錄殘留網路的容量 40 int flow[arraysize];                //標記從源點到當前節點實際還剩多少流量可用 41 int pre[arraysize];                 //標記在這條路徑上當前節點的前驅,同時標記該節點是否在隊列中 42 int n,m,np,nc; 43 queue<int> myqueue; 44 int BFS(int src,int des) 45 { 46     int i,j; 47     while(!myqueue.empty())       //隊列清空 48         myqueue.pop(); 49     for(i=0;i<m+1;++i) 50     { 51         pre[i]=-1; 52     } 53     pre[src]=0; 54     flow[src]= maxData; 55     myqueue.push(src); 56     while(!myqueue.empty()) 57     { 58         int index = myqueue.front(); 59         myqueue.pop(); 60         if(index==des)            //找到了增廣路徑 61             break; 62         for(i=0;i<m+1;++i) 63         { 64             if(i!=src && map[index][i]>0 && pre[i]==-1) 65             { 66                  pre[i] = index; //記錄前驅 67                  flow[i] = min(map[index][i],flow[index]);   //關鍵:迭代的找到增量 68                  myqueue.push(i); 69             } 70         } 71     } 72     if(pre[des]==-1)      //殘留圖中不再存在增廣路徑 73         return -1; 74     else 75         return flow[des]; 76 } 77 int maxFlow(int src,int des) 78 { 79     int increasement=0; 80     int sumflow=0; 81     while((increasement=BFS(src,des))!=-1) 82     { 83          int k = des;          //利用前驅尋找路徑 84          while(k!=src) 85          { 86               int last = pre[k]; 87               map[last][k]-=increasement; //改變正向邊的容量 88               map[k][last]+=increasement; //改變反向邊的容量 89               k=last; 90          } 91          sumflow+=increasement; 92     } 93     return sumflow; 94 } 95 int main() 96 { 97     int i,j; 98     int start,end,cost; 99     while(scanf("%d%d%d%d",&m,&np,&nc,&n)!=EOF)100     {101         memset(map,0,sizeof(map));102         memset(flow,0,sizeof(flow));103         char c[10];104         for(i=0;i<n;++i)105         {106             scanf("%s",c);107             sscanf(c,"(%d,%d)%d",&start,&end,&cost);108             if(start==end)               //考慮起點終點相同的情況109                continue;110             map[start][end]+=cost;     //此處注意可能出現多條同一起點終點的情況111         }112         for(i=0;i<np;i++)113         {114             scanf("%s",c);115             sscanf(c,"(%d)%d",&start,&cost);116             map[m+1][start]=cost;117         }118         for(i=0;i<nc;i++)119         {120             scanf("%s",c);121             sscanf(c,"(%d)%d",&end,&cost);122             map[end][m]=cost;123         }124         cout<<maxFlow(m+1,m)<<endl;125     }126     return 0;127 }
View Code

聯繫我們

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