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