標籤: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