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

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

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


#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
",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;
}


原文地址:https://www.cnblogs.com/dyllove98/p/3155590.html