【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\n",dis[T]); } return 0; }