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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ 3281_Dining

發(fā)布時間:2025/4/9 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 3281_Dining 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:

FJ準(zhǔn)備了F種食物和D種飲料,每頭牛都有喜歡的食物和飲料,并且每頭牛都只能分配一種食物和飲料。問如何分配使得同時得到喜歡的食物和飲料的牛數(shù)量最多。

分析:

首先想到將牛與其對應(yīng)的食物和飲料匹配起來,即在食物、飲料與牛之間連一條邊,再在s和所有食物之間、t和所有飲料之間連一條邊。這樣每一條路徑都對應(yīng)著食物飲料和牛之間的匹配方案。那么如何避免一頭牛被分配多組匹配呢?就將一頭牛拆成兩個結(jié)點(diǎn),并用一條容量為1的邊連接起來,這樣求出構(gòu)成的圖中的最大流,即得解。這里使用的是Dinic算法。

代碼:

#include<cstdio> #include<vector> #include<cstring> #include<queue> using namespace std; struct edge{int to, cap, rev;}; const int maxn = 105, maxm = 2000055, INF = 0x3fffffff; int d[maxm], iter[maxm]; int s, t; vector<edge>G[maxm]; int dr[maxn][maxn], f[maxn][maxn]; void add_edge(int from, int to, int cap) {G[from].push_back((edge){to, cap, G[to].size()});G[to].push_back((edge){from, 0, G[from].size()-1}); } void bfs() {memset(d, -1, sizeof(d));queue<int>q;d[s] = 0;q.push(s);while(!q.empty()){int v = q.front();q.pop();for(int i = 0; i <G[v].size(); i++){edge &e = G[v][i];if(e.cap>0&&d[e.to]<0){d[e.to] = d[v] + 1;q.push(e.to);}}} } int dfs(int v, int f) {if(v==t) return f;for(int &i = iter[v]; i < G[v].size(); i++){edge &e = G[v][i];if(e.cap > 0 && d[v] < d[e.to]){int tf = dfs(e.to, min(f, e.cap));if(tf > 0){e.cap -= tf;G[e.to][e.rev].cap +=tf;return tf;}}}return 0; } int max_flow() {int flow = 0;for(;;){bfs();if(d[t]<0) return flow;memset(iter, 0, sizeof(iter));int f;while((f = dfs(s, INF))>0){flow += f;}} } int main (void) {int N, F, D;scanf("%d%d%d",&N, &F, &D);int a, b;s = 2 * N + F + D + 1, t = s + 1;for(int i = 1; i <= N; i++){scanf("%d%d",&a, &b);add_edge(i, N + i, 1);for(int j = 0; j < a; j++){scanf("%d",&f[i][j]);add_edge(2 * N + f[i][j], i, 1);}for(int j = 0; j < b; j++){scanf("%d",&dr[i][j]);add_edge(N + i, 2 * N + F + dr[i][j], 1);}}for(int i = 1; i <= F; i++)add_edge(s, 2 * N + i, 1);for(int i = 1; i <= D; i++)add_edge(2 * N + F + i, t, 1);printf("%d\n",max_flow()); }

增廣路徑必須滿足的性質(zhì)
1.有奇數(shù)條邊。
2.起點(diǎn)在二分圖的左半邊,終點(diǎn)在右半邊。
3.路徑上的點(diǎn)一定是一個在左半邊,一個在右半邊,交替出現(xiàn)。(其實(shí)二分圖的性質(zhì)就決定了這一點(diǎn),因?yàn)槎謭D同一邊的點(diǎn)之間沒有邊相連,不要忘記哦。)
4.整條路徑上沒有重復(fù)的點(diǎn)。
5.起點(diǎn)和終點(diǎn)都是目前還沒有配對的點(diǎn),而其它所有點(diǎn)都是已經(jīng)配好對的。
6.路徑上的所有第奇數(shù)條邊都不在原匹配中,所有第偶數(shù)條邊都出現(xiàn)在原匹配中。
7.最后,也是最重要的一條,把增廣路徑上的所有第奇數(shù)條邊加入到原匹配中去,并把增廣路徑中的所有第偶數(shù)條邊從原匹配中刪除(這個操作稱為增廣路徑的取反),則新的匹配數(shù)就比原匹配數(shù)增加了1個(奇數(shù)=偶數(shù)+1)。

轉(zhuǎn)載于:https://www.cnblogs.com/Tuesdayzz/p/5758773.html

總結(jié)

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

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

主站蜘蛛池模板: 四虎永久在线精品免费网址 | 影音先锋啪啪 | 国产亚洲黄色片 | 91精品久久久久 | 成年人视频在线播放 | 国产懂色av | 丝袜美腿一区二区三区 | 国产污污视频 | 视频一区日韩 | 91久久人人 | 久久亚洲电影 | 97小视频| 中文字幕一区二区视频 | 99在线观看免费 | 情侣av| 97超碰碰碰 | 国产美女免费 | 精品人妻伦一二三区久 | 国产美女三级无套内谢 | 免费在线国产精品 | 久久黄色影院 | 欧美一区二区三区爱爱 | 国产剧情精品 | 在线免费观看黄色小视频 | 91成人高清 | 欧美亚洲国产成人 | 日韩成人在线视频观看 | 日韩国产一区二区三区 | 亚洲精品成人 | 97香蕉久久夜色精品国产 | 国产成人精品一区二区色戒 | 日韩欧美一区二区在线 | 免费无码国产v片在线观看 三级全黄做爰在线观看 | 少妇被按摩师摸高潮了 | a毛片在线免费观看 | 在线观看少妇 | 亚洲无码精品国产 | 热热久 | 久久五月综合 | 亚洲丝袜在线观看 | 国产精品麻豆一区二区三区 | 天天噜日日噜 | 国产一区日韩精品 | 综合网在线视频 | 可以看av的网站 | 免费三级大片 | 男人午夜免费视频 | 久久一本精品 | 1000部啪啪 | 波多野结衣在线视频播放 | 在线观看日韩中文字幕 | 国产日韩中文 | 日本三级一区二区 | 欧美性理论片在线观看片免费 | 亚洲免费一二三区 | 天天av天天 | 亚洲av色区一区二区三区 | 久久99热这里只有精品 | 伊人91视频 | 能看毛片的网站 | 美女脱了内裤喂我喝尿视频 | 亚洲色图视频在线 | 操批网站| 黄色的网站在线观看 | 99香蕉视频 | 亚洲高清精品视频 | 污视频大全 | 久久久一区二区三区四区 | 日韩欧美资源 | 欧美www| 国产五区 | 嫩草研究院在线 | 中出少妇 | 黑人3p波多野结衣在线观看 | 亚洲男女视频 | 在线观看 中文字幕 | 福利在线视频导航 | 久久一卡二卡 | www国产亚洲精品久久麻豆 | 精品国产麻豆 | 91麻豆成人 | 亚洲精品一区二区三区在线 | 婷综合| 久久久久久久精 | 国产91精 | 免费观看美女裸体网站 | 国产97色在线 | 国产 | 99久久99久久 | 人妖一区二区三区 | 日韩精品视频一区二区三区 | 一区二区三区免费播放 | 一区视频网站 | 亚洲精品网址 | 就去吻综合 | 国产免费av电影 | 色天天综合| 肉丝美足丝袜一区二区三区四 | 污网站在线免费 | 午夜免费看片 |