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));
	}
}

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

bzoj 2709: [Violet 1]迷宫花园 (最短路)

2709: [Violet 1]迷宫花园 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 840  Solved: 288 [Submit][St...
  • clover_hxy
  • clover_hxy
  • 2017年03月17日 19:05
  • 191

【bzoj2709】 迷宫花园 spfa

好傻逼呀,二分+spfa,没了。 结果数据坑爹,有一行最后有一个空格,坑死了。 #include #include #include #include #include #include #def...
  • u012288458
  • u012288458
  • 2015年09月20日 19:36
  • 564

51nod 1459 迷宫游戏

1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前。该迷宫由若干个房间组成,每个房间都有一个得分,...
  • qq_32734731
  • qq_32734731
  • 2016年12月08日 19:24
  • 315

最短路径 之 SPFA算法

最短路径 之 SPFA算法 http://hi.baidu.com/southhill/item/ab26a342590a5aae60d7b967 求最短路径的算法有许多种,除...
  • JustSteps
  • JustSteps
  • 2013年04月08日 15:32
  • 12465

透析SPFA算法(图例讲解)

SPFA算法是Bellman-Ford的队列优化,所以先介绍Bellman-Ford算法。        Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值...
  • u013445530
  • u013445530
  • 2014年12月05日 23:53
  • 1495

jzoj 3522 迷宫花园

jzoj 3522
  • ssl_lyy
  • ssl_lyy
  • 2017年07月07日 15:49
  • 91

jzoj3522 迷宫花园(bfs)

3522. 【NOIP2013模拟11.7B组】迷宫花园(maze)  Description 给定一个一定存在从起点到终点的路径的四联通迷宫。已知Tar左右方向移动的时间为1,上...
  • zhanghaoxian1
  • zhanghaoxian1
  • 2017年07月07日 18:20
  • 52

二分查找中的边界问题:+1,-1,<,<=

题目描述 统计一个数字在排序数组中出现的次数。 分析: 把边界确定更加准确点,[left,end]确定为闭区间,只要不在这个区间,就+1或者-1,不要模糊,不要模糊两可 class Solut...
  • qq_29108585
  • qq_29108585
  • 2017年03月20日 16:22
  • 423

电子老鼠闯迷宫

描述有一只电子老鼠被困在如下图所示的迷宫中。这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部分是路。电子老鼠可以在路上向上、下、左、右行走,每一步走一个格子。现给定一个起点S和一个终点T...
  • Mammon_
  • Mammon_
  • 2016年05月15日 01:00
  • 462

读书笔记:CSS禅意花园-布局方法

在介绍布局之前,我们应该先清楚布局的法则,虽然这个是在Web布局之前出现的,但是这里也是延伸了它的规则。     在任何一种以图画作为表达方式的艺术品中,布局的作用都是-有效的组织内容,但是在Web...
  • xiaoyaosanren45
  • xiaoyaosanren45
  • 2014年06月15日 22:20
  • 1217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BZOJ2709: [Violet 1]迷宫花园 二分+Spfa
举报原因:
原因补充:

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