zoukankan      html  css  js  c++  java
  • 【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;
    }
    

      

  • 相关阅读:
    套接字I/O模型-WSAAsyncSelect
    套接字I/O模型-完成端口IOCP
    套接字I/O模型-WSAEventSelect(转载)
    Win7+VS2010环境下CEGUI 0.8.4编译过程详解
    数组去重统计排序
    计算当前月有几天
    前端开发仓库
    Jquery中bind(), live(), on(), delegate()四种注册事件的优缺点,建议使用on()
    图表那些事
    图标字体,矢量图标
  • 原文地址:https://www.cnblogs.com/yangjiyuan/p/5650485.html
Copyright © 2011-2022 走看看