【bzoj2464】中山市选[2009]小明的游戏

直接转换成最短路

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;

#define INF 0x7fffffff
#define MAXN 510

struct data
{
	int v,w,next;
}e[MAXN*MAXN];
int head[MAXN*MAXN];
int cnt;

struct edge
{
	int to,len;
}p;

struct cmp
{
	bool operator () (const edge a,const edge b)
	{
		return a.len > b.len;
	}
};

int n,m;
int S,T;
int x1,y1,x2,y2;

int dis[MAXN*MAXN],vis[MAXN*MAXN];

char f[MAXN][MAXN];

void link(int u,int v,int w)
{
	e[++cnt]=(data){v,w,head[u]};
	head[u]=cnt;
}

void Dij(int s)
{
	priority_queue<edge,vector<edge>,cmp>q;
	memset(vis,0,sizeof(vis));
	for (int i=1;i<=n;i++)
		dis[i]=INF;
	dis[s]=0;
	vis[s]=1;
	for (int i=head[s];i;i=e[i].next)
		if (dis[e[i].v]>dis[s]+e[i].w)
		{
			dis[e[i].v]=dis[s]+e[i].w;
			p.to=e[i].v;
			p.len=dis[p.to];
			q.push(p);
		}
	for (int i=1;i<=n-1;i++)
	{
		if (q.empty())
			break;
		p=q.top();
		q.pop();
		while (vis[p.to] && !q.empty())
			p=q.top(),q.pop();
		int x=p.to;
		vis[x]=1;
		for (int j=head[x];j;j=e[j].next)
			if (dis[e[j].v]>dis[x]+e[j].w)
			{
				dis[e[j].v]=dis[x]+e[j].w;
				p.to=e[j].v;
				p.len=dis[p.to];
				q.push(p);
			}
	}
}

int main()
{
	while (scanf("%d%d",&n,&m))
	{
		if (n+m==0)
			break;
		memset(e,0,sizeof(e));
		memset(head,0,sizeof(head));
		cnt=0;
		for (int i=1;i<=n;i++)
			for (int j=1;j<=m;j++)
				cin>>f[i][j];
		for (int i=1;i<=n;i++)
			for (int j=1;j<=m;j++)
			{
				if (j<m)
				{
					if (f[i][j]==f[i][j+1])
						link(j+(i-1)*m,j+(i-1)*m+1,0),link(j+(i-1)*m+1,j+(i-1)*m,0);
					else
						link(j+(i-1)*m,j+(i-1)*m+1,1),link(j+(i-1)*m+1,j+(i-1)*m,1);
				}
				if (i<n)
				{
					if (f[i][j]==f[i+1][j])
						link(j+(i-1)*m,j+i*m,0),link(j+i*m,j+(i-1)*m,0);
					else
						link(j+(i-1)*m,j+i*m,1),link(j+i*m,j+(i-1)*m,1);
				}
			}
		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		S=x1*m+y1+1;
		T=x2*m+y2+1;
		n=n*m;
		Dij(S);
		printf("%d
",dis[T]);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/yangjiyuan/p/5650485.html