专题四 第八道题
来源:互联网 发布:kingcms php 编辑:程序博客网 时间:2024/04/30 22:14
1.题目编号:1016
2.简单题意:XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每一条路有一个安全系数s,s是在 0 和 1 间的实数(包括0,1),一条从u 到 v 的通道P 的安全度为Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边,现在8600 想出去旅游,面对这这么多的路,他想找一条最安全的路。但是8600 的数学不好,想请你帮忙
3.解题思路形成过程:找一条最安全的路则需要安全度最大,因为ek是P上的边,而且s是在0~1之间的数,相乘的越少则安全度越大,所以还是一个最短路径的问题,可以用dijstral算法求得。
4.感悟:乍一看,求安全度最大我还以为是求最长路径呢,仔细分析之后其实就是最短路径的变形。用cin输入会超时,还是C语言的输入输出好用=.=
5.AC的代码:
#include <iostream>
#include <stdio.h>
#include <string>
#define M 1001
using namespace std;
int n,m;
double S[M][M],dis[M];
void Dijkstra(int x,int y)
{
bool v[M]={0};
int i,j;
for(i=1;i<=n;i++) dis[i]=(i==x?1:0);
for(i=1;i<=n;i++)
{
int k;
double Min=0;
for(j=1;j<=n;j++) if(!v[j] && dis[j]>Min) Min=dis[k=j];
v[k]=1;
for(j=1;j<=n;j++) dis[j]=max(dis[j],dis[k]*S[k][j]);
}
if(dis[y]) printf("%.3lf\n",dis[y]);
else cout<<"What a pity!"<<endl;
}
int main()
{
int i,j;
int a,b,c;
while(cin>>n && n)
{
memset(S,0,sizeof(S));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%lf",&map[i][j]);
}
cin>>m;
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
Dijkstra(a,b);
}
}
return 0;
}
原题:
31 0.5 0.50.5 1 0.40.5 0.4 131 22 31 3
0.5000.4000.500
- 专题四 第八道题
- 专题三 第八题
- 专题四 第二道题
- 专题四 第四道题
- 专题四 第六道题
- 专题四 第七道题
- 专题四 第九道题
- 专题四 第十道题
- 专题四 第十二道题
- 专题二 第七道题和第八道题
- 专题四 第五道题w
- 专题四 第一道题
- 专题四 第三个题
- 专题四 第十一道题
- dp专题 第八题 最长公共子上升序列
- 第八周 任务四
- 第八周阅读四
- 第八周周四总结
- ubuntu中配置jdk环境
- git克隆代码到本地
- ReactJs入门教程
- Problem-I
- JavaScript概述
- 专题四 第八道题
- ThreadLocal学习笔记
- std::move -- 强制转化为右值
- springmvc数据绑定
- 使用WPF创建SignalR服务端
- hibernate映射属性
- ASCII码表完整版
- linux c++消息队列(ftok,msgget,msgsnd,msgrcv,msgctl)
- 浏览器兼容性问题大汇总