415. [HAOI2009] 旅行

Posted ioioioioioio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了415. [HAOI2009] 旅行相关的知识,希望对你有一定的参考价值。

★★   输入文件:toura.in   输出文件:toura.out   简单对比

时间限制:1 s   内存限制:128 MB

试题描述
小明住在城市1,而他的朋友小芳住在城市n。最近小明收到小芳的邀请,准备于近期赴约。可是由于最近下了很多暴雨,很多道路都被淹没。从城市1出发到城市n之间有很多小城镇,并且两个小城镇之间有一条直接道路相连。小明经过对近期天气和地形的科学分析,绘出了每条道路能顺利通行的概率。
为了能顺利到达目的地,请帮助小明找出一条最稳妥的路线,也就是从城市1出发到达城市n的路线中能顺利通行的最大概率。
 
输入数据
文件第一行包含两个整数n和m,n为城市数,m为道路条数。
接下来m行,每行包含三个整数a,b,p ( 1<=p<=100 ),表示小城镇a与小城镇b间有一条道路,顺利通过这条道路的概率为p%。
 
输出数据
一个实数P,为到达城市n的最大概率,P精确到小数点后6位。
 
 
样例输入

技术分享

5 7
5 2 100
3 5 80
2 3 70
2 1 50
3 4 90
4 1 85
3 1 70
样例输出
61.200000
 
样例说明:选择路线为1-4-3-5,概率为85%*90%*80%=61.2%
测试数据范围
30%的数据,n<=1000,m<=3000
100%的数据,n<=10000,m<=30000
 
代码并非自己写的,那个eps是个什么鬼,有点搞不懂:
 
#include<cstdio>
#include<algorithm>
#include<queue>
#include<iostream>

using namespace std;
const int N=1e5+10;
const double eps=1e-9;

struct edge{int f,t,l;}w[N];
int n,m,head[N],next[N],tail[N],cnt;

void add(int f,int t,int l)
{
	w[++cnt]=(edge){f,t,l};
	if (!head[f]) head[f]=tail[f]=cnt;
		else tail[f]=next[tail[f]]=cnt; 
}

double dis[N];bool inque[N];

void spfa()
{
	queue<int> Q;
	for (int i=1;i<=n;i++) dis[i]=0;
	dis[1]=1;Q.push(1);
	while (!Q.empty())
	{
		int v=Q.front();Q.pop();
		inque[v]=0;
		for (int i=head[v];i;i=next[i])
			if (dis[w[i].t]+eps<dis[v]/100*w[i].l)
			{
				dis[w[i].t]=dis[v]/100*w[i].l;
				if (!inque[w[i].t]) inque[w[i].t]=1,Q.push(w[i].t);
			}
	}
}

int main()
{
	
	freopen("toura.in","r",stdin);
	freopen("toura.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1,f,t,l;i<=m;i++)
	{
		scanf("%d%d%d",&f,&t,&l);
		add(f,t,l);add(t,f,l);
	}
	spfa();
	printf("%.6lf\n",100*dis[n]);
	return 0;
}

  

 

以上是关于415. [HAOI2009] 旅行的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1050HAOI2006旅行comf

[HAOI2006]旅行comf

[HAOI2006]旅行(并查集)

[HAOI2006]旅行 题解(kruskal)

BZOJ 1050: [HAOI2006]旅行comf(枚举+并查集)

BZOJ [HAOI2006]旅行comf