【网络流24题】火星探险问题 题解
生活随笔
收集整理的這篇文章主要介紹了
【网络流24题】火星探险问题 题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目傳送門
題目大意: 有一張 n×mn\times mn×m 的網格圖,要從左上角往右下角走 kkk 次,只能向下或向右走,000 表示地板(即能走),111 表示障礙(即不能走),222 表示地板上有石頭,現在要求收集盡可能多的石頭,給出走的方案。
題解
把石頭看成費用,那么這就是一個最大費用最大流了。
由于每個石頭只能撿 111 次,所以每個格子需要拆點,中間連一條流量為 111,費用為 111 的邊,然后因為這個格子就算沒有石頭也能走,所以還需要連一條流量無限,費用為 000 的邊。
然后相鄰的格子連一條流量無限,費用為 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); }總結
以上是生活随笔為你收集整理的【网络流24题】火星探险问题 题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vba 更新mysql数据库_使用VBA
- 下一篇: python网络爬虫(web spide