HDOJ 1596 find the safest road ((最短路变形) Dijkstra SPFA)

2023-12-08 21:18

本文主要是介绍HDOJ 1596 find the safest road ((最短路变形) Dijkstra SPFA),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

find the safest road

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9081    Accepted Submission(s): 3193


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
注 - 此题为:  HDOJ 1596  find the safest road   (最长路(最短路变形) Dijkstra && SPFA)

说明:    由于寻找最安全道路,越大越安全,Dijkstra && SPFA 寻找最大路径

       安全度计算:安全度为Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 

已AC代码:(Dijkstra)

#include<cstdio>
#define max(x,y) (x>y?x:y)
#define INF 0xfffffff
int n,vis[1010];
double map[1010][1010],d[1010];void Dijkstra(int s)  //模板变形 
{int i,j;for(i=1;i<=n;++i){vis[i]=0;d[i]=0;  // 0可以理解为那两个城市之间没有直接的通道 }d[s]=1;while(1){int j=-1;for(i=1;i<=n;++i){if(!vis[i]&&(j==-1||d[i]>d[j])) // 找较大者 j=i;}if(j==-1)break;vis[j]=1;for(i=1;i<=n;++i){d[i]=max(d[i],d[j]*map[j][i]); // 找较大者 }}
}int main()
{int i,j,Q,a,b;while(scanf("%d",&n)!=EOF){for(i=1;i<=n;++i)for(j=1;j<=n;++j)scanf("%lf",&map[i][j]);scanf("%d",&Q);for(i=0;i<Q;++i){scanf("%d%d",&a,&b);Dijkstra(a);if(d[b]==0)printf("What a pity!\n");elseprintf("%.3f\n",d[b]);}}return 0;
}


已AC代码:(SPFA

#include<cstdio>
#include<cstring>
#include<queue>
#define MAX 1005
#define INF 0x3f3f3f
using namespace std;struct Edge{int from,to;double vel;int next;
};
Edge edge[MAX*MAX];   // 不能太小 
int head[MAX*MAX],vis[MAX];
double dist[MAX];
int n,cnt;void addedge(int u,int v,double w)
{Edge E={u,v,w,head[u]};edge[cnt]=E;head[u]=cnt++;
}void SPFA(int st)  // 模板 
{queue<int>Q;memset(dist,0,sizeof(dist));memset(vis,0,sizeof(vis));Q.push(st);vis[st]=1;dist[st]=1;while(!Q.empty()){int u=Q.front();Q.pop();vis[u]=0;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(dist[v]<dist[u]*edge[i].vel)  // 变为求最大 {dist[v]=dist[u]*edge[i].vel;if(vis[v]==0){vis[v]=1;Q.push(v);}}}}
}int main()
{int i,j,st,ed;while(scanf("%d",&n)!=EOF){cnt=0;memset(head,-1,sizeof(head));double w;for(i=1;i<=n;++i)for(j=1;j<=n;++j){scanf("%lf",&w);addedge(i,j,w);}int N;scanf("%d",&N);while(N--){scanf("%d%d",&st,&ed);SPFA(st);if(dist[ed]==0)printf("What a pity!\n");elseprintf("%.3f\n",dist[ed]);}}return 0;
}

这篇关于HDOJ 1596 find the safest road ((最短路变形) Dijkstra SPFA)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/471350

相关文章

【Linux系列】find命令使用与用法详解

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等常用开发工具系列:常用的开发工具,IDEA,M

BFS:解决多源最短路问题

文章目录 什么是多源最短路问题?1.矩阵2.飞地的数量3.地图的最高点4.地图分析总结 什么是多源最短路问题? 多源最短路问题(Multi-Source Shortest Path Problem,MSSP)是图论中的一个经典问题,它的目标是在给定图中找到从多个源点到所有其他顶点的最短路径。这个问题可以视为单源最短路问题(Single-Source Shortest Pa

Leetcode 3195. Find the Minimum Area to Cover All Ones I

Leetcode 3195. Find the Minimum Area to Cover All Ones I 1. 解题思路2. 代码实现 题目链接:3195. Find the Minimum Area to Cover All Ones I 1. 解题思路 这一题还是挺简单的,只要找到所有1所在的元素的上下左右4个边界,作为目标矩形的四个边即可。 2. 代码实现 给出python

「Debug R」报错unable to find an inherited method for function是如何产生的

在一个群里看到这样一条报错,截图如下: 报错信息 当然这种问题解决起来也很快,无非就是把报错信息复制出来放在搜索引擎上,只不过你要挑选合适的搜索引擎。 百度 谷歌 必应 解决方案就是用dplyr::select。 虽然报错解决了,但是我还想着要重复出这个报错。因为只有能重复出报错,才能证明你不是运气好才解

最短路算法总结(dijkstra,flyod,bellmanford,spfa)

总结 d i j k s t r a dijkstra dijkstra h e a p − d i j k s t r a heap-dijkstra heap−dijkstra b e l l m a n f o r d bellmanford bellmanford s p f a spfa spfa f l o y d floyd floyd最短路类型单源单源单源单源全源数据维护 e

道路 Road(百练,POJ)

题目链接: 1724 -- ROADS (poj.org) 题目描述: 思路: 这题目乍一看,是一个含有2个标尺的单源最短路问题,挺难处理的。 既然没法直接用最短路处理,那我们就“记录信息”,将花费的时间也记录进dp数组,然后跑“状态最短路”。 用f[i][j] 表示到达点i 且 总花费时间为j的最短距离,然后跑堆优化的dijkstra算法就好。由于不含有负边权,因此可以搞一个vis数

[leetcode] 515. Find Largest Value in Each Tree Row

Find Largest Value in Each Tree Row 描述 You need to find the largest value in each row of a binary tree. Example: Input: 1/ \3 2/ \ \ 5 3 9 Output: [1, 3, 9] 我的代码 简单的dfs。 要使

iNOC产品部-杨辉三角的变形(第二种方法也可以通过,测试数据太弱,n10000就会爆的)

// iNOC产品部-杨辉三角的变形(第二种方法也可以通过,测试数据太弱,n>10000就会爆的) #include<bits/stdc++.h>using namespace std;int F(int n,int k){if(k==1||k==2*n-1)return 1;if(k<1||k>2*n-1)return 0;return F(n-1,k)+F(n-1,k-1)+F(n-1

BFS 解决最短路问题

例题一 解法(bfs 求最短路): 算法思路: 利⽤层序遍历来解决迷宫问题,是最经典的做法。我们可以从起点开始层序遍历,并且在遍历的过程中记录当前遍历的层数。这样就能在找到出⼝的时候,得到起点到出⼝的最短距离。 例题二 解法: 算法思路: 如果将「每次字符串的变换」抽象成图中的「两个顶点和⼀条边」的话,问题就变成了「边权为

cmake find_package 原理简介以及使用说明

下面简单介绍Cmake 如何使用find_package命令对外部库进行查找: cmake本身不提供任何关于搜索库的便捷方法,也不会对库本身的环境变量进行设置。它仅仅是按照优先级顺序在指定的搜索路径进行查找Findxxx.cmake文件和xxxConfig.cmake文件(其中xxx代表库的名字,特别注意的是有大小写之分),这两个文件大体上是没有区别的,cmake能够找到这两个文件中的任何一个,