日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ 1149 最大流建图 PIGS

發(fā)布時間:2023/12/18 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 1149 最大流建图 PIGS 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:

給出豬圈個數(shù) m 和買家人數(shù) n

然后給出m個豬圈的豬的頭數(shù)..

接下來 n 行..

給出mm a1 a2 .. a(mm) k 例如 2 1 5 3 表示第i+1個用戶 有mm(2) 個豬圈的鑰匙 就是有第 a1(1) 個和第 a2(5) 個豬圈的鑰匙..還想要買得k頭豬..

問最多能夠賣出多少頭..

思路:

其實就是最大流~

唯一有趣的是建圖的過程..

/************************************/

建一個超級源點0..超級匯點n+1

以客戶作為節(jié)點..

?

超級源點根據(jù)第一個擁有豬圈的客戶和超級源點連線..容量就是第一個客戶累計可以得到多少頭豬..

因為第一個打開豬圈的客戶可以取得所有的豬..所以超級源點和客戶之間的連線容量就表示第一個打開豬圈的人雖能夠得到的數(shù)量..

然后接下來的每一個人與前一個打開豬圈的人之間連線..容量為INF..因為可以從別的豬圈調(diào)豬過來..

然后求得的最大流就是可以賣得的豬的數(shù)量..

/**********************************/

Tips:

很喜歡這道題建圖的技巧~感覺很有才~~~很聰明~~雖然..可能很基礎~

大體就是上面說的了~其中用到了last數(shù)組來記錄該豬圈上一個擁有鑰匙的人~

Code:

View Code 1 #include <stdio.h> 2 #include <cstring> 3 #include <queue> 4 #include <algorithm> 5 using namespace std; 6 #define clr(x) memset(x, 0, sizeof(x)) 7 const int INF = 0x1f1f1f1f; 8 const int MAXN = 110; 9 10 int cap[MAXN][MAXN], flow[MAXN][MAXN]; 11 int p[MAXN], a[MAXN]; 12 int f, n; 13 14 void EK(int s, int t) 15 { 16 queue<int> q; 17 memset(flow, 0, sizeof(flow)); 18 memset(a, 0, sizeof(a)); 19 memset(p, 0, sizeof(p)); 20 f = 0; 21 while(1) 22 { 23 memset(a, 0, sizeof(a)); 24 a[s] = INF; 25 q.push(s); 26 while(!q.empty()) 27 { 28 int u = q.front(); 29 q.pop(); 30 for(int v = 0; v <= n+1; ++v) 31 if(!a[v] && cap[u][v] > flow[u][v]) 32 { 33 p[v] = u; 34 q.push(v); 35 a[v] = a[u] < cap[u][v] - flow[u][v]? a[u]:cap[u][v] - flow[u][v]; 36 } 37 } 38 if(a[t] == 0) break; 39 for(int u = t; u != s; u = p[u]) 40 { 41 flow[p[u]][u] += a[t]; 42 flow[u][p[u]] -= a[t]; 43 } 44 f += a[t]; 45 } 46 } 47 48 49 int main() 50 { 51 int i, j, k; 52 int nn, mm; 53 int tmp, m; 54 int s, t; 55 int h[1010]; 56 int last[1010]; 57 58 while(scanf("%d %d", &mm, &nn) != EOF) 59 { 60 clr(cap); 61 clr(last); 62 s = 0, t = nn+1; 63 n = nn; 64 65 for(i = 1; i <= mm; ++i) 66 scanf("%d", &h[i]); 67 68 for(i = 1; i <= nn; ++i){ 69 scanf("%d", &m); 70 for(j = 0; j < m; ++j){ 71 scanf("%d", &tmp); 72 if(last[tmp] == 0) 73 cap[s][i] += h[tmp]; 74 else 75 cap[last[tmp]][i] = INF; 76 last[tmp] = i; 77 } 78 scanf("%d", &cap[i][t]); 79 } 80 81 EK(s, t); 82 printf("%d\n", f); 83 } 84 return 0; 85 }

轉載于:https://www.cnblogs.com/Griselda/archive/2012/08/28/2660976.html

總結

以上是生活随笔為你收集整理的POJ 1149 最大流建图 PIGS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。