当前位置: 代码迷 >> 综合 >> poj-2195-Going Home最小费用最大流
  详细解决方案

poj-2195-Going Home最小费用最大流

热度:45   发布时间:2023-12-19 11:16:59.0

重新切一遍最小费用最大流~~~

这到题目的数据范围有问题,尽量开大就好了~~


#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
#define INF 999999
struct list
{int u;int v;int next;
}node[1000001];
int num;
int head[1001];
int cost[1001][1001];
void add(int l,int r,int v)
{node[num].u=r;node[num].v=v;node[num].next=head[l];head[l]=num++;
}
int nos;
int juli(int x,int y,int m)
{return abs(y/m-x/m)+abs(y%m-x%m);
}
int pre[1001];
int bfs()
{int visit[1001];int dist[1001];int i;for(i=0;i<=nos;i++)dist[i]=INF;memset(visit,0,sizeof(visit));memset(pre,-1,sizeof(pre));queue<int>q;q.push(0);visit[0]=1;dist[0]=0;while(!q.empty()){int e=q.front();q.pop();//cout<<"弹"<<" "<<e<<endl;visit[e]=0;for(i=head[e];i!=-1;i=node[i].next){int r=node[i].u;if(dist[e]+node[i].v<dist[r]&&cost[e][r]){pre[r]=e;dist[r]=dist[e]+node[i].v;//	printf("pre[%d]=%d,dist[%d]=%d\n",r,e,r,dist[r]);if(!visit[r]){q.push(r);//	cout<<"入"<<" "<<r<<endl;visit[r]=1;}}}}if(dist[nos]!=INF)return 1;return 0;
}
void change()
{int minx;minx=INF;int i;for(i=nos;pre[i]!=-1;i=pre[i]){minx=min(minx,cost[pre[i]][i]);}for(i=nos;pre[i]!=-1;i=pre[i]){cost[pre[i]][i]-=minx;cost[i][pre[i]]+=minx;}
}
int main()
{int i,j,m,n;char str[100001];while(scanf("%d%d%*c",&n,&m)&&(n||m)){memset(head,-1,sizeof(head));memset(cost,0,sizeof(cost));int hm,mm;hm=mm=0;int ms[100001];int hs[100001];for(i=0;i<n;i++){scanf("%s",str);for(j=0;j<m;j++){if(str[j]=='m')ms[++mm]=i*m+j;else if(str[j]=='H')hs[++hm]=i*m+j;}getchar();}nos=hm+mm+1;for(i=1;i<=mm;i++){add(0,i,0);add(i,0,0);cost[0][i]=1;cost[i][0]=0;}for(j=1;j<=hm;j++){add(j+mm,mm+hm+1,0);add(mm+hm+1,j+mm,0);cost[j+mm][mm+hm+1]=1;cost[mm+hm+1][j+mm]=0;}for(i=1;i<=mm;i++){for(j=1;j<=hm;j++){int ju=juli(ms[i],hs[j],m);add(i,j+mm,ju);add(j+mm,i,-ju);cost[i][j+mm]=INF;cost[j+mm][i]=0;}}while(bfs()){change();//cout<<"------------------------------------"<<endl;}int sum=0;for(i=1;i<=mm;i++)for(j=1;j<=hm;j++){sum+=(INF-cost[i][j+mm])*juli(ms[i],hs[j],m);}cout<<sum<<endl;}return 0;
}


  相关解决方案