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

【bzoj2709】 迷宫花园 spfa

好傻逼呀,二分+spfa,没了。 结果数据坑爹,有一行最后有一个空格,坑死了。 #include #include #include #include #include #include #def...

BZOJ 2716 [Violet 3]天使玩偶 KDtree

以下引用自“‎Alboi_真神名曰驴蛋蛋”对于一颗普通的K-D树,让K-D树上每个节点记录它这颗子树的大小(size)和这颗子树所能延伸到的最大横坐标,最小横坐标,最大纵坐标,最小纵坐标......就...

BZOJ2724: [Violet 6]蒲公英

裸的分块 不知道可以去看clj写的区间众数 感觉自己常数很大代码也丑的不行。。。 #include #include #include #include #include #in...

【BZOJ】【P2724】【Violet 6】【蒲公英】【题解】【分块】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2724 区间众数,分

【BZOJ 2724】 [Violet 6]蒲公英

分块在线求区间众数~

BZOJ 2725 [Violet 6]故乡的梦

堆优dijkstra+线段树膜:http://blog.csdn.net/popoqqq/article/details/47841783为了表达清楚,记不删边时最短路为E1,删去某一条E1上的边之后...

BZOJ2724 [Violet 6]蒲公英 解题报告【数据结构】【分块】

BZOJ 2724
  • theljt
  • theljt
  • 2017年07月18日 20:20
  • 85

【bzoj 2716】[Violet 3]天使玩偶 (cdq分治+树状数组)

被酒莫惊春睡重,赌书消得泼茶香,当时只道是寻常

bzoj 2725 [Violet 6]故乡的梦

无向图,给定S和T,多次询问在删除某条边时两点间最短路 我的SPFA被卡了=.=。我们对所有不在最短路径的上的边 ,设它的起点为u 终点为v。那么对于这条边,包含该边的最优的S到T路径就应该是 S-S...
  • ahcisy
  • ahcisy
  • 2016年12月20日 14:15
  • 170
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BZOJ2709: [Violet 1]迷宫花园 二分+Spfa
举报原因:
原因补充:

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