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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Poj 3281 Regional Chengdu Food(Dicnic)

發(fā)布時(shí)間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Poj 3281 Regional Chengdu Food(Dicnic) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(wǎng)絡(luò)流最大流的優(yōu)化算法Dicnic,每一步對原圖進(jìn)行分層,然后用DFS求增廣路。時(shí)間復(fù)雜度是O(n^2*m) 。

Poj 3281 和 9.16號(hào)成都regional網(wǎng)絡(luò)賽food那道題,都是很好的模板題。。

以food那題為例,這樣建圖:設(shè)一個(gè)源點(diǎn),每一種food為一層,每個(gè)人分成兩部分,people1 people2兩層,每種飲料是一層,然后是一個(gè)匯點(diǎn)。

每一種食物的個(gè)數(shù),即為源點(diǎn)到那種food的流量;

飲料同理。

每一個(gè)人只消耗一種一個(gè)食物和一種一個(gè)飲料,因此每種食物(或飲料)與人的連線,流量為1?

people1與people2的間的流量為1

模板放這兒先。

POJ 3281

#include<stdio.h> #include<string.h> const int EDGE_NUM = 20001;//邊數(shù) const int POINT_NUM = 501;//點(diǎn)數(shù) struct edge {int v;//點(diǎn)int next;//下一邊int value;//當(dāng)前邊流量 } edge[2*EDGE_NUM]; //邊信息,以鄰接表形式存儲(chǔ)int p[POINT_NUM];//p[i]記錄最后一條以i為起點(diǎn)的邊的id,即以i為起點(diǎn)的最后一條邊為edge[p[i]],而edge[p[i]].next則為以i為起點(diǎn)的倒數(shù)第二條邊,以此類推 int level[POINT_NUM];//level[i]記錄i點(diǎn)的層次 int que[POINT_NUM],out[POINT_NUM];//輔助數(shù)組 int edgeNumber;void init() {edgeNumber = 0;memset(p,-1,sizeof(p)); }inline void addEdge(int from,int to,int value)//添加邊,以鄰接表形式存儲(chǔ) {edge[edgeNumber].v = to;edge[edgeNumber].value = value;edge[edgeNumber].next = p[from];p[from] = edgeNumber++; }int Dinic(int source,int sink,int n) {int i,maxFlow = 0;while(true){int head,tail;for(i=0; i<n; i++)level[i] = 0;level[source] = 1;//源點(diǎn)為第一層head = 0;tail = 0;que[0] = source;//que這里當(dāng)隊(duì)里使用while(head<=tail)//BFS該剩余圖,計(jì)算每個(gè)可達(dá)點(diǎn)層次{int cur = que[head++];for(i=p[cur]; i!=-1; i=edge[i].next){if(edge[i].value>0&&level[edge[i].v]==0){level[edge[i].v] = level[cur]+1;que[++tail] = edge[i].v;}}}if(level[sink]==0)break;//不存在增廣路for(i=0; i<n; i++)out[i]=p[i]; //out[i]動(dòng)態(tài)記錄可用邊int q = -1;//q為已經(jīng)搜索到的點(diǎn)的個(gè)數(shù),que存放途徑邊信息while(true)//DFS剩余圖,查找增廣路{if(q<0)//當(dāng)前路為空{(diào)int cur = out[source];for(; cur!=-1; cur=edge[cur].next) //查找第一條邊{if(edge[cur].value>0&&out[edge[cur].v]!=-1&&level[edge[cur].v]==2)//合法第一條邊必須滿足:1.流量大于0;2.終點(diǎn)有可用邊 3:終點(diǎn)層次為2break;}if(cur==-1)break;//找不到第二層,當(dāng)前剩余圖已經(jīng)沒有增廣路que[++q]=cur;//存入第一條邊idout[source]=edge[cur].next;}int curnode = edge[que[q]].v;//當(dāng)前路的終點(diǎn)if(curnode==sink)//找到一條增廣路{int thisflow = edge[que[0]].value;//thisflow為當(dāng)前增廣路的流量int index = 0;//標(biāo)記最小流量邊的idfor(i=1; i<=q; i++){if(thisflow>edge[que[i]].value){thisflow=edge[que[i]].value;index = i;}}maxFlow+=thisflow;for(i=0; i<=q; i++){edge[que[i]].value-=thisflow;edge[que[i]^1].value+=thisflow;//與其方向相反的邊}q = index-1;//查找下一條增廣路時(shí)可直接使用當(dāng)前路的前q條邊}else//尚未找到匯點(diǎn){int cur = out[curnode];for(; cur!=-1; cur=edge[cur].next){if(edge[cur].value>0&&out[edge[cur].v]!=-1&&level[edge[cur].v]==level[curnode]+1)break;}if(cur==-1)//沒有下一條路{out[curnode]=-1;//標(biāo)記當(dāng)前點(diǎn)的可達(dá)邊為0q--;}else{que[++q]=cur;out[curnode]=edge[cur].next;//下一次搜索時(shí)可達(dá)邊從edge[cur].next開始查找}}}}return maxFlow; }int main() {int Nn,Ff,Dd;while(scanf("%d%d%d",&Nn,&Ff,&Dd)!=EOF){init();int foodstart = 1;int cow1 = Ff+2;int cow2 = cow1+Nn+1;int drinkstart = cow2+Nn+1;int end = drinkstart+Dd+1;int i;for(i=0; i<Nn; i++) //添加牛邊{addEdge(cow1+i,cow2+i,1);addEdge(cow2+i,cow1+i,0);}for(i=0; i<Ff; i++) //添加食物邊{addEdge(0,foodstart+i,1); addEdge(foodstart+i,0,0);}for(i=0; i<Dd; i++) //添加飲料{addEdge(drinkstart+i,end,1); addEdge(end,drinkstart+i,0);}for(i=0; i<Nn; i++){int f,d;scanf("%d%d",&f,&d);int x;while(f--){scanf("%d",&x);x--;addEdge(foodstart+x,cow1+i,1);addEdge(cow1+i,foodstart+x,0);}while(d--){scanf("%d",&x);x--;addEdge(cow2+i,drinkstart+x,1);addEdge(drinkstart+x,cow2+i,0);}}printf("%d\n",Dinic(0,end,end+1));}return 0; }
成都regional網(wǎng)絡(luò)賽

#include<cstdio> #include<cstring> #include <memory.h> const int EDGE_NUM = 100001;//邊數(shù) const int POINT_NUM = 250;//點(diǎn)數(shù) struct edge {int v;//點(diǎn)int next;//下一邊int value;//當(dāng)前邊流量 } edge[2*EDGE_NUM]; //邊信息,以鄰接表形式存儲(chǔ)int p[POINT_NUM];//p[i]記錄最后一條以i為起點(diǎn)的邊的id,即以i為起點(diǎn)的最后一條邊為edge[p[i]],而edge[p[i]].next則為以i為起點(diǎn)的倒數(shù)第二條邊,以此類推 int level[POINT_NUM];//level[i]記錄i點(diǎn)的層次 int que[POINT_NUM],out[POINT_NUM];//輔助數(shù)組 int edgeNumber; int food[250]; int drink[250]; void init() {edgeNumber = 0;memset(p,-1,sizeof(p)); } void addEdge(int from,int to,int value)//添加邊,以鄰接表形式存儲(chǔ) {edge[edgeNumber].v = to;edge[edgeNumber].value = value;edge[edgeNumber].next = p[from];p[from] = edgeNumber++; }int Dinic(int source,int sink,int n) {int i,maxFlow = 0;while(true){int head,tail;for(i=0; i<n; i++)level[i] = 0;level[source] = 1;//源點(diǎn)為第一層head = 0;tail = 0;que[0] = source;//que這里當(dāng)隊(duì)里使用while(head<=tail)//BFS該剩余圖,計(jì)算每個(gè)可達(dá)點(diǎn)層次{int cur = que[head++];for(i=p[cur]; i!=-1; i=edge[i].next){if(edge[i].value>0&&level[edge[i].v]==0){level[edge[i].v] = level[cur]+1;que[++tail] = edge[i].v;}}}if(level[sink]==0)break;//不存在增廣路for(i=0; i<n; i++)out[i]=p[i]; //out[i]動(dòng)態(tài)記錄可用邊int q = -1;//q為已經(jīng)搜索到的點(diǎn)的個(gè)數(shù),que存放途徑邊信息while(true)//DFS剩余圖,查找增廣路{if(q<0)//當(dāng)前路為空{(diào)int cur = out[source];for(; cur!=-1; cur=edge[cur].next) //查找第一條邊{if(edge[cur].value>0&&out[edge[cur].v]!=-1&&level[edge[cur].v]==2)//合法第一條邊必須滿足:1.流量大于0;2.終點(diǎn)有可用邊 3:終點(diǎn)層次為2break;}if(cur==-1)break;//找不到第二層,當(dāng)前剩余圖已經(jīng)沒有增廣路que[++q]=cur;//存入第一條邊idout[source]=edge[cur].next;}int curnode = edge[que[q]].v;//當(dāng)前路的終點(diǎn)if(curnode==sink)//找到一條增廣路{int thisflow = edge[que[0]].value;//thisflow為當(dāng)前增廣路的流量int index = 0;//標(biāo)記最小流量邊的idfor(i=1; i<=q; i++){if(thisflow>edge[que[i]].value){thisflow=edge[que[i]].value;index = i;}}maxFlow+=thisflow;for(i=0; i<=q; i++){edge[que[i]].value-=thisflow;edge[que[i]^1].value+=thisflow;//與其方向相反的邊}q = index-1;//查找下一條增廣路時(shí)可直接使用當(dāng)前路的前q條邊}else//尚未找到匯點(diǎn){int cur = out[curnode];for(; cur!=-1; cur=edge[cur].next){if(edge[cur].value>0&&out[edge[cur].v]!=-1&&level[edge[cur].v]==level[curnode]+1)break;}if(cur==-1)//沒有下一條路{out[curnode]=-1;//標(biāo)記當(dāng)前點(diǎn)的可達(dá)邊為0q--;}else{que[++q]=cur;out[curnode]=edge[cur].next;//下一次搜索時(shí)可達(dá)邊從edge[cur].next開始查找}}}}return maxFlow; }int main() {int Nn,Ff,Dd;while(scanf("%d%d%d",&Nn,&Ff,&Dd)!=EOF){init();int foodstart = 1;int cow1 = Ff+1;int cow2 = cow1+Nn+1;int drinkstart = cow2+Nn+1;int end = drinkstart+Dd+1;for(int i=1;i<=Ff;i++)scanf("%d",&food[i]);for(int i=1;i<=Dd;i++)scanf("%d",&drink[i]);int i;for(i=0; i<Nn; i++) //添加牛邊{addEdge(cow1+i,cow2+i,1);addEdge(cow2+i,cow1+i,0);}for(i=0; i<Ff; i++) //添加食物邊{addEdge(0,foodstart+i,food[i+1]); //每一種食物路徑的流量。addEdge(foodstart+i,0,0);}for(i=0; i<Dd; i++) //添加飲料{addEdge(drinkstart+i,end,drink[i+1]);addEdge(end,drinkstart+i,0);}char t;for(i=0; i<Nn; i++){getchar();for(int j=0; j<Ff; j++){scanf("%c",&t);if(t=='Y'){addEdge(foodstart+j,cow1+i,1);addEdge(cow1+i,foodstart+j,0);}}}for(i=0; i<Nn; i++){getchar();for(int j=0; j<Dd; j++){scanf("%c",&t);if(t=='Y'){addEdge(cow2+i,drinkstart+j,1);addEdge(drinkstart+j,cow2+i,0);}}}printf("%d\n",Dinic(0,end,end+1));}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/MicZ/archive/2012/09/17/2785369.html

總結(jié)

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

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

主站蜘蛛池模板: 自拍偷拍亚洲精品 | 一区二区三区国产在线 | 成人做爰视频www网站小优视频 | 日韩在线播放av | 极品美女销魂一区二区三区 | 国产成人精品片 | 琪琪色综合网 | 日本不卡一区二区三区视频 | 久久久久99精品成人片试看 | 欧美成人综合视频 | 日日干天天 | av免费观看入口 | 网址av | 免费看国产片在线观看 | 日韩av电影一区 | 九九九九精品九九九九 | 国产中文字幕乱人伦在线观看 | 成人av在线网 | 中文字幕国产亚洲 | 久久国内| 女十八毛片 | 午夜精品一区二区三区免费视频 | 欧美亚洲影院 | 一区二区三区视频观看 | 欧美偷拍综合 | 一区二区三区天堂 | 欧美日韩久久久久 | 欧美少妇性生活 | 97成人在线观看 | 亚洲一级av毛片 | 国产无套内射普通话对白 | 国产高清久久久 | 国产高清一区 | 丰满少妇熟乱xxxxx视频 | 久久橹 | 激情的网站 | 夜夜爱夜夜操 | 国产精品对白 | youjizzxxxxx| 一边吃奶一边摸做爽视频 | 狠狠草视频 | 天天想你在线观看完整版高清 | 能看的av| 自拍偷拍av | 影音先锋每日资源 | 91视频插插插 | 好吊色av| 在线观看国产区 | 亚洲免费视频一区二区三区 | 黄色大片网 | 黄色大片黄色大片 | 天堂а在线中文在线新版 | 黑森林福利视频导航 | 久久综合九色综合欧美狠狠 | 日韩图片区 | 国产肉体ⅹxxx137大胆 | 日本啪啪啪一区二区 | 欧美在线性爱视频 | 日韩一区二区三区久久 | av中文字 | 亚洲欧美日韩精品永久在线 | 色淫湿视频 | 日日综合网 | 人人草在线| www.-级毛片线天内射视视 | 中文字幕一区二区三区波野结 | 成人黄页网站 | 五月香蕉网 | 国产精品.xx视频.xxtv | 91九色视频在线 | 天堂中文在线资 | 久久亚洲av成人无码国产电影 | a在线观看免费 | 欧美日韩一区二区区别是什么 | 色哟哟视频在线观看 | 日本视频在线看 | 成人深夜福利在线观看 | 涩涩涩涩涩涩涩涩涩 | 91cn.com| 国产久操视频 | 午夜在线观看一区 | 国产一级淫片免费 | 午夜伦理剧场 | 欧美成人福利视频 | 国产又黄又爽 | 亚洲综合小说网 | 午夜视频网站 | www.亚色 | 91狠狠爱| 欧美日韩中文字幕一区二区 | 欲色综合| 欧美日韩视频一区二区三区 | 欧美日韩系列 | 夜夜春影院| 丰满人妻一区二区三区无码av | 成年网站在线播放 | 亚洲 日本 欧美 中文幕 | 老鸭窝久久 | 天天看夜夜看 |