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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

【网络流24题】火星探险问题 题解

發(fā)布時(shí)間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【网络流24题】火星探险问题 题解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目傳送門(mén)

題目大意: 有一張 n×mn\times mn×m 的網(wǎng)格圖,要從左上角往右下角走 kkk 次,只能向下或向右走,000 表示地板(即能走),111 表示障礙(即不能走),222 表示地板上有石頭,現(xiàn)在要求收集盡可能多的石頭,給出走的方案。

題解

把石頭看成費(fèi)用,那么這就是一個(gè)最大費(fèi)用最大流了。

由于每個(gè)石頭只能撿 111 次,所以每個(gè)格子需要拆點(diǎn),中間連一條流量為 111,費(fèi)用為 111 的邊,然后因?yàn)檫@個(gè)格子就算沒(méi)有石頭也能走,所以還需要連一條流量無(wú)限,費(fèi)用為 000 的邊。

然后相鄰的格子連一條流量無(wú)限,費(fèi)用為 000 的邊即可。

代碼如下:

#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define maxn 10010 #define inf 999999999int n,m,k,a[40][40]; struct edge{int x,y,z,cost,next;}; edge e[maxn<<1]; int first[maxn],len=1; void buildroad(int x,int y,int z,int cost) {e[++len]=(edge){x,y,z,cost,first[x]};first[x]=len; } int f1[2]={0,1},f2[2]={1,0}; int pos(int x,int y){return (x-1)*m+y;} int q[maxn],st,ed,f[maxn],fa[maxn]; bool v[maxn]; bool SPFA() {for(int i=1;i<=2*n*m;i++)f[i]=-inf;memset(fa,0,sizeof(fa));st=1;ed=2;q[st]=1;v[1]=true;f[1]=0;while(st!=ed){int x=q[st++];st=st>2*n*m?1:st;v[x]=false;for(int i=first[x];i;i=e[i].next){int y=e[i].y;if(e[i].z&&f[y]<f[x]+e[i].cost){f[y]=f[x]+e[i].cost;fa[y]=i;if(!v[y])v[q[ed++]=y]=true,ed=ed>2*n*m?1:ed;}}}return fa[2*n*m]; } void go(int x,int now) {if(x==2*n*m)return;for(int i=first[x];i;i=e[i].next)//printf("%d %d %d\n",e[i].x,e[i].y,e[i].z);if(e[i].z!=inf&&e[i].z>10){printf("%d %d\n",now,((x-1)%m)<((e[i].y-1)%m));e[i].z++; go(e[i].y+n*m,now);break;} }int main() {scanf("%d %d %d",&k,&m,&n);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j]!=1){if(a[i][j]==2)buildroad(pos(i,j),pos(i,j)+n*m,1,1),buildroad(pos(i,j),pos(i,j)+n*m,0,-1);buildroad(pos(i,j),pos(i,j)+n*m,inf,0);buildroad(pos(i,j),pos(i,j)+n*m,0,0);for(int k=0;k<2;k++){int x=i+f1[k],y=j+f2[k];if(x>n||y>m||a[x][y]==1)continue;buildroad(pos(i,j)+n*m,pos(x,y),inf,0);buildroad(pos(x,y),pos(i,j)+n*m,0,0);}}for(int j=1;j<=k;j++){SPFA();for(int i=fa[2*n*m];i;i=fa[e[i].x])e[i].z--,e[i^1].z++;}for(int i=1;i<=k;i++)go(1+n*m,i); }

總結(jié)

以上是生活随笔為你收集整理的【网络流24题】火星探险问题 题解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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