find the safest road

Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 23   Accepted Submission(s) : 12
Problem Description
XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每一条路有一个安全系数s,s是在 0 和 1 间的实数(包括0,1),一条从u 到 v 的通道P 的安全度为Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 ,现在8600 想出去旅游,面对这这么多的路,他想找一条最安全的路。但是8600 的数学不好,想请你帮忙 ^_^
 
Input
输入包括多个测试实例,每个实例包括:第一行:n。n表示城市的个数n<=1000; 接着是一个n*n的矩阵表示两个城市之间的安全系数,(0可以理解为那两个城市之间没有直接的通道) 接着是Q个8600要旅游的路线,每行有两个数字,表示8600所在的城市和要去的城市
 
Output
如果86无法达到他的目的地,输出"What a pity!", 其他的输出这两个城市之间的最安全道路的安全系数,保留三位小数。
 
Sample Input
3 1 0.5 0.5 0.5 1 0.4 0.5 0.4 1 3 1 2 2 3 1 3
 
Sample Output
0.500 0.400 0.500
 代码:
 #include<stdio.h>
#include<string.h>
#define MAX(x,y)(x>y?x:y)
const int MAXN=;
double map[MAXN][MAXN],d[MAXN];
int vis[MAXN];
int n;
void initial(){
memset(d,,sizeof(d));
memset(vis,,sizeof(vis));
}
void dijskra(int s){
initial();//写错位置了,应该每次都初始化
d[s]=;
while(true){
int k=-;
for(int i=;i<=n;i++)
if(!vis[i]&&(k==-||d[i]>d[k]))k=i;
if(k==-)break;
vis[k]=;
for(int i=;i<=n;i++)
d[i]=MAX(d[i],d[k]*map[k][i]);
}
}
int main(){int Q,a,b;
while(~scanf("%d",&n)){
memset(map,,sizeof(map));
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%lf",&map[i][j]);
scanf("%d",&Q);
while(Q--){
scanf("%d%d",&a,&b);
dijskra(a);
if(d[b]==0.0)puts("What a pity!");
else printf("%.3lf\n",d[b]);
}
}
return ;
}

SPFA:

 #include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int MAXN=;
const int MAXM=;
int head[MAXM],vis[MAXN];
double dis[MAXN];
struct Edge{
int from,to,next;
double value;
};
Edge edg[MAXM];
int n,edgnum;
queue<int>dl;
void initial(){
memset(dis,,sizeof(dis));
memset(vis,,sizeof(vis));
while(!dl.empty())dl.pop();
}
void add(int u,int v,double value){
Edge E;
E.from=u;E.to=v;E.value=value;E.next=head[u];
edg[edgnum]=E;
head[u]=edgnum++;
}
void SPFA(int sx){
initial();
dis[sx]=;
vis[sx]=;
dl.push(sx);
while(!dl.empty()){
int k=dl.front();
dl.pop();
vis[k]=;
for(int i=head[k];i!=-;i=edg[i].next){
int v=edg[i].to;
if(dis[k]*edg[i].value>dis[v]){
dis[v]=dis[k]*edg[i].value;
if(!vis[v])
dl.push(v),vis[v]=;
}
}
}
}
int main(){
int a,b,Q;
double v;
while(~scanf("%d",&n)){
memset(head,-,sizeof(head));
edgnum=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
scanf("%lf",&v);
add(i,j,v);
}
scanf("%d",&Q);
while(Q--){
scanf("%d%d",&a,&b);
SPFA(a);
if(dis[b]==0.0)puts("What a pity!");
else printf("%.3lf\n",dis[b]);
}
}
return ;
}

find the safest road的更多相关文章

  1. 杭电 1595 find the safest road

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  2. hdoj 1596 find the safest road【最短路变形,求最大安全系数】

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. hdu1569find the safest road(floyd变形求最大安全值)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  4. HDU 1596 find the safest road (最短路)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  5. HDU1596 find the safest road

    find the safest road XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每一条路有一个安全系数s,s是在 0 和 1 间的实数(包括0,1),一 ...

  6. hdu1596find the safest road(floyd)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. hdu 1596 find the safest road (最短路径)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. HDU.1596 find the safest road (Floyd)

    HDU.1596 find the safest road (Floyd) 题意分析 与普通的最短路不太相同,本题有些许的变化. 1. 要找到由i到j最安全的路,故在求解的时候要保证mp[i][j]尽 ...

  9. HDU——1596find the safest road(邻接矩阵+优先队列SPFA)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

随机推荐

  1. 博客终于开通了happy

    HelloWorld! 在我不懈的申请下,我的博客终于在第4次申请后成功开通了! 作为一个毕业两年的码农,现在才开始想要记录一些东西,似乎有点晚 -_-! 希望多年以后可以在这看到我长长的足迹!

  2. iis 回收工作进程时出错的解决办法

    第一种解决方案: iis6系统默认的工作进程回收时间是29个小时有很多问题是在回收工作进程后出现很多问题如典型的500错误等经过我做服务器的一段时间的观察大家可以不用回收工作进程而是把应用程序池的最大 ...

  3. Android-PullToRefresh下拉刷新库基本用法

    How:(使用) 转自:http://blog.csdn.net/hantangsongming/article/details/42490277 PullToRefresh是一套实现非常好的下拉刷新 ...

  4. cf467C George and Job

    C. George and Job time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  5. poj 3287 The Trip, 2007_贪心

    题意:把一个包放入另一个包内,使得总共要带的件数最少,就是说大包可以装小包,且一个大包只能装一个小包,但是这个小包可以继续装更小的包. 思路:因为相同大小的包不能互相装,所以最小数量就是有相同尺寸的包 ...

  6. hdu 1754 I Hate It_线段树

    题意:略 思路:套hdu1166模版改改就行了,要注意的是,网上有的代码是错的,还贴出来... #include <iostream> #include<cstdio> #in ...

  7. Eclipse上GIT插件EGIT使用

    一.安装EGit插件 參考:MyEclipse8.5整合Git 二.EGit配置 配置个人信息 Window > Preferences > Team > Git > Conf ...

  8. C#获取变量名的扩展方法

    // </summary> /// <param name="var_name"></param> /// <param name=&qu ...

  9. sql显示12个月数据

    需求 最近在做一个财务报表展示系统,Budget需要当月上传,还未上传月份的数据也需要显示出来. 数据库设计 cBudget表结构如下 CREATE TABLE [dbo].[cBudget]( ,) ...

  10. 2015.01.06 JQuery

    jQuery是一个兼容多浏览器的javascript库.开发出来的JavaScript的脚本包.非侵入性的脚本. 下载地址:http://jquery.com/          (打不开网页需要翻* ...