博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1596 find the safest road(最短路求最大值的题目,有两种稍微不同的处理方式)
阅读量:4035 次
发布时间:2019-05-24

本文共 4631 字,大约阅读时间需要 15 分钟。

帮同学调个程序,一看题目不难,自己就试着做了一下,最短路的题目,稍微变换一点,就弱弱的错了n遍,太纠结了,写篇博客纪念一下这迟迟到来的AC。。。

1、

2、题目分析

其实这道题目就是简单地dijkstra,原来的加法得换成乘法,初始值也有所变化,就这么弱弱的错了n遍

AC代码:

#include
#include
#include
using namespace std;#define N 1015double map[N][N];double dist[N];int vis[N];void dijstra(int v,int n){ //memset(dist,-1,sizeof(dist)); for(int i=1; i<=n; i++) dist[i]=0; for(int i=1; i<=n; i++) { //dist[i]=map[v][i]; vis[i]=0; } vis[v]=1; dist[v]=1; for(int ii=1; ii<=n; ii++) { double minn=0; int u=v; for(int i=1; i<=n; i++) { if(dist[i]>minn && vis[i]==0) { minn=dist[i]; u=i; } } vis[u]=1; for(int i=1; i<=n; i++) { if( vis[i]==0 ) { double newdist=dist[u]*map[u][i]; if(newdist>dist[i]) dist[i]=newdist; } } }}int main(){ int n,Q,s,e; while(scanf("%d",&n)!=EOF) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { scanf("%lf",&map[i][j]); //if(map[i][j]==0) //map[i][j]=INF; //printf("%.3f ",map[i][j]); } } scanf("%d",&Q); while(Q--) { scanf("%d%d",&s,&e); dijstra(s,n); if(dist[e]) { printf("%.3f\n",dist[e]); } else printf("What a pity!\n"); } } return 0;}

另一种处理方式,如不注意vis[v]=1,这样赋值了,就会run time error

改正后的AC代码:

#include
#include
#include
using namespace std;#define N 1015double map[N][N];double dist[N];int vis[N];void dijstra(int v,int n){ //memset(dist,-1,sizeof(dist)); for(int i=1; i<=n; i++) dist[i]=0; for(int i=1; i<=n; i++) { dist[i]=map[v][i]; vis[i]=0; } //标记了vis[v]=1,就会越界 //vis[v]=1; //初始值是0表示无法到达,所以初始值是1 dist[v]=1; for(int ii=1; ii<=n; ii++) { double minn=0; int u; for(int i=1; i<=n; i++) { if(dist[i]>minn && vis[i]==0) { minn=dist[i]; u=i; } } vis[u]=1; for(int i=1; i<=n; i++) { if( vis[i]==0 ) { double newdist=dist[u]*map[u][i]; if(newdist>dist[i]) dist[i]=newdist; } } }}int main(){ int n,Q,s,e; while(scanf("%d",&n)!=EOF) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { scanf("%lf",&map[i][j]); //if(map[i][j]==0) //map[i][j]=INF; //printf("%.3f ",map[i][j]); } } scanf("%d",&Q); while(Q--) { scanf("%d%d",&s,&e); dijstra(s,n); if(dist[e]) { printf("%.3f\n",dist[e]); } else printf("What a pity!\n"); } } return 0;}

 vis[v]可以标记成1,越界是u导致的

附AC代码:

#include
#include
#include
using namespace std;#define N 4015double map[N][N];double dist[N];int vis[N];void dijstra(int v,int n){ //memset(dist,-1,sizeof(dist)); for(int i=1; i<=n; i++) dist[i]=0; for(int i=1; i<=n; i++) { dist[i]=map[v][i]; vis[i]=0; } vis[v]=1; //初始值是0表示无法到达,所以初始值是1 dist[v]=1; for(int ii=1; ii
minn && vis[i]==0) { minn=dist[i]; u=i; } } //printf("u=%d\n",u); //得判断minn的值,如果找不到minn,那么u就会是任意值,可能越界 if(minn==0) break; vis[u]=1; for(int i=1; i<=n; i++) { if( vis[i]==0 ) { double newdist=dist[u]*map[u][i]; if(newdist>dist[i]) dist[i]=newdist; } } }}int main(){ int n,Q,s,e; while(scanf("%d",&n)!=EOF) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { scanf("%lf",&map[i][j]); //if(map[i][j]==0) //map[i][j]=INF; //printf("%.3f ",map[i][j]); } } scanf("%d",&Q); while(Q--) { scanf("%d%d",&s,&e); dijstra(s,n); if(dist[e]) { printf("%.3f\n",dist[e]); } else printf("What a pity!\n"); } } return 0;}

 

转载地址:http://qwcdi.baihongyu.com/

你可能感兴趣的文章
Oracle 物化视图
查看>>
PHP那点小事--三元运算符
查看>>
解决国内NPM安装依赖速度慢问题
查看>>
Brackets安装及常用插件安装
查看>>
Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
查看>>
fastcgi_param 详解
查看>>
Nginx配置文件(nginx.conf)配置详解
查看>>
标记一下
查看>>
一个ahk小函数, 实现版本号的比较
查看>>
IP报文格式学习笔记
查看>>
autohotkey快捷键显示隐藏文件和文件扩展名
查看>>
Linux中的进程
查看>>
学习python(1)——环境与常识
查看>>
学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域
查看>>
自然计算时间复杂度杂谈
查看>>
当前主要目标和工作
查看>>
Intellij IDEA启动优化,让开发的感觉飞起来
查看>>
使用 Springboot 对 Kettle 进行调度开发
查看>>
如何优雅的编程,lombok你怎么这么好用
查看>>
一文看清HBase的使用场景
查看>>