• 【刷题】BZOJ 2346 [Baltic 2011]Lamp


    Description

    2255是一个傻X,他连自己家灯不亮了都不知道。
    某天TZ大神路过他家,发现了这一情况,
    于是TZ开始行侠仗义了。
    TZ发现是电路板的问题,
    他打开了电路板,发现线路根本没有连上!!
    于是他强大的脑力可以使某个格子上的线路从变为/,
    或者从/变为。
    2255不会电路(因为他什么都不会),但是他想知道TZ最少要用多少次脑力才能使他家的灯变亮。
    如果无法变亮,输出“NO SOLUTION”。

    n,m<=500

    Input

    Output

    Sample Input

    3 5
    /
    ///
    /\

    Sample Output

    1

    Solution

    可以先考虑费用流,然后发现其实就是最短路
    要改变的话长度为 (1) ,不改变长度为 (0) ,跑最短路即可

    #include<bits/stdc++.h>
    #define ui unsigned int
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    const int MAXN=251001+10,inf=0x3f3f3f3f;
    int n,m,e,beg[MAXN],s,t,d[MAXN],p[MAXN],nex[MAXN<<3],to[MAXN<<3],w[MAXN<<3];
    char str[510];
    std::deque<int> q;
    template<typename T> inline void read(T &x)
    {
    	T data=0,w=1;
    	char ch=0;
    	while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    	if(ch=='-')w=-1,ch=getchar();
    	while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    	x=data*w;
    }
    template<typename T> inline void write(T x,char ch='')
    {
    	if(x<0)putchar('-'),x=-x;
    	if(x>9)write(x/10);
    	putchar(x%10+'0');
    	if(ch!='')putchar(ch);
    }
    template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
    template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
    template<typename T> inline T min(T x,T y){return x<y?x:y;}
    template<typename T> inline T max(T x,T y){return x>y?x:y;}
    inline int id(int x,int y)
    {
    	return (x-1)*(m+1)+y;
    }
    inline void insert(int x,int y,int z)
    {
    	to[++e]=y;
    	nex[e]=beg[x];
    	beg[x]=e;
    	w[e]=z;
    }
    inline int bfs()
    {
    	for(register int i=1;i<=t;++i)d[i]=inf;
    	d[s]=0;
    	p[s]=1;
    	q.push_back(s);
    	while(!q.empty())
    	{
    		int x=q.front();
    		q.pop_front();
    		p[x]=0;
    		for(register int i=beg[x];i;i=nex[i])
    			if(d[to[i]]>d[x]+w[i])
    			{
    				d[to[i]]=d[x]+w[i];
    				if(!p[to[i]])
    				{
    					p[to[i]]=1;
    					if(q.empty()||d[to[i]]<d[q.front()])q.push_front(to[i]);
    					else q.push_back(to[i]);
    				}
    			}
    	}
    	if(d[t]==inf)return -1;
    	else return d[t];
    }
    int main()
    {
    	read(n);read(m);
    	for(register int i=1;i<=n;++i)
    	{
    		scanf("%s",str+1);
    		for(register int j=1;j<=m;++j)
    			if(str[j]=='/')
    			{
    				insert(id(i+1,j),id(i,j+1),0);
    				insert(id(i,j+1),id(i+1,j),0);
    				insert(id(i,j),id(i+1,j+1),1);
    				insert(id(i+1,j+1),id(i,j),1);
    			}
    			else
    			{
    				insert(id(i,j),id(i+1,j+1),0);
    				insert(id(i+1,j+1),id(i,j),0);
    				insert(id(i+1,j),id(i,j+1),1);
    				insert(id(i,j+1),id(i+1,j),1);
    			}
    	}
    	s=id(1,1);t=id(n+1,m+1);
    	int ans=bfs();
    	if(ans==-1)puts("NO SOLUTION");
    	else write(ans,'
    ');
    	return 0;
    }
    
  • 相关阅读:
    js相关小实例——大图轮播
    js相关小实例——div实现下拉菜单
    js相关小实例——二级菜单
    html5部分相关
    CSS3常用属性(边框、背景、文本效果、2D转换、3D转换、过渡、有过渡效果大图轮播、动画)
    数据访问
    php测试
    单例模式
    Doc
    横竖列表 下拉隐藏显示
  • 原文地址:https://www.cnblogs.com/hongyj/p/9417593.html
Copyright © 2020-2023  润新知