BZOJ2709: [Violet 1]迷宫花园 二分+Spfa

原创 2016年08月31日 07:10:55

2709: [Violet 1]迷宫花园

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 758  Solved: 264

Description

Input

Output

Sample Input

2
2.5 4 5
#####
#S #
# E#
#####
21 13 12
############
#S## #E#
# ## # # #
# # # # #
### # # # #
# # # # #
# ## # # #
## # # # #
### # # # #
## # # # #
# ## # #
# # #
############

Sample Output

0.50000
0.21053

HINT

题解:

二分一下v,然后重新构图跑spfa,看在L内能不能从S跑到T

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int M=100005;
const int N=10005;
const double inf=2e9;
int T,n,m,tot,mp[105][105]; 
int from[M],nxt[M],lj[N],to[M],cnt;
double w[M],tim;
void add(int f,int t,double p)
{
	cnt++;
	from[cnt]=f;
	to[cnt]=t;
	nxt[cnt]=lj[f];
	lj[f]=cnt;
	w[cnt]=p;
}
void insert(int x,int y,double p){add(x,y,p),add(y,x,p);}
int get(int x,int y){return (x-1)*m+y;}
queue<int>Q;
double d[N];
bool inq[N];
void Spfa(int s,int t)
{
	while(!Q.empty()) Q.pop();
	for(int i=1;i<=n*m;i++) d[i]=inf;
	d[s]=0;
	Q.push(s);
	while(!Q.empty())
	{
		int x=Q.front();
		Q.pop();
		inq[x]=false;
		for(int i=lj[x];i;i=nxt[i])
		if(d[to[i]]>d[x]+w[i]) 
		{
			d[to[i]]=d[x]+w[i];
			if(!inq[to[i]])
			{
				Q.push(to[i]);
				inq[to[i]]=true;
			} 
		} 
	}
}
int main()
{
	//freopen("Oakley.out","w",stdout);
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lf%d%d",&tim,&n,&m);
		char c;
		int s,t;
		for(int i=1;i<=n;i++)
		{
			scanf("\n"); 
			for(int j=1;j<=m;j++)
			{
			    scanf("%c",&c);
				if(c=='S') s=get(i,j);
				if(c=='E') t=get(i,j);
			    if(c!='#') mp[i][j]=1;
			}
		}
		//for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)cout<<mp[i][j];cout<<endl;}
		double l=0,r=10,mid;
		while(l<r-1e-8)
		{
			mid=(l+r)/2;
			cnt=0;
			for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
			if(mp[i][j]) 
			{
			    if(i>=2&&mp[i-1][j]) insert(get(i-1,j),get(i,j),mid);
			    if(j>=2&&mp[i][j-1]) insert(get(i,j-1),get(i,j),1);
			}
			//for(int i=1;i<=cnt;i++) {cout<<"from="<<from[i]<<" to="<<to[i];printf(" w=%lf\n",w[i]);}
			Spfa(s,t);
			if(d[t]<=tim) l=mid;
			else r=mid;
			memset(lj,0,sizeof(lj));
		}
		printf("%.5lf\n",mid);
		memset(mp,0,sizeof(mp));
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

BZOJ2709: [Violet 1]迷宫花园 二分+Spfa

2709: [Violet 1]迷宫花园 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 758  Solved: 264 [Submit...

bzoj2709 [Violet 1]迷宫花园

二分+spfa

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

校园迷宫(rqnoj195)

校园迷宫题目描述总算期中考了,鄙人被教育局分配到了SY学校,当然是陪着很多人的。不知转了多少次车,总算到了。可惜的是,SY学校整个像个迷宫一样,就在门口贴了张学校地图。鄙人就开始研究地图了,但是学校错...

走迷宫1

走迷宫1 Time Limit: 1000ms Memory Limit: 65535KB 64-bit integer IO format: %lld      Java cl...

迷宫 1

( 程序文件名: maze1. pas/c/cpp)  【问题描述】 在最新版恶魔城游戏的最后一关有一个 n*m 的迷宫,入口坐标是左上角(1,1),出口坐标是右下角(n,m)。迷宫中的某些小格...

【Violet 5】【BZOJ2721】樱花

Description Input Output Sample Input 3 Sample Output 9 HINT Sourceinterviewstreet–E...

迷宫 栈方式2

/* algo3-5.c利用栈求解迷宫问题(只输出一个解,算法3.3) */ typedef struct /* 迷宫坐标位置类型 */ {    int x; /* 行值 */    int...

一个求迷宫入口到出口最近距离的程序 JAVA版本

本文给出一个c/c++语言版的求迷宫入口到出口的最短路径的程序。程序的大部分使用标准c语言编写,包括 输入和输出。唯一用到C++库的地方是使用STL了中的deque。迷宫的宽和高,迷宫矩阵,迷宫的入口...

迷宫出口以及迷宫最短路径的求解

整理出来方便大家复习//完成迷宫 #pragma warning (disable:4996) #include #include #include using namespace std; #inc...

笔试题:03年_迷宫

#include #include #include using namespace std; //请编写一个迷宫程序 //广度优先寻找最短时间走出迷宫。深度优先遍历解决:能否走出迷宫。 ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)