博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hrbust 1339 Touring 最短路Dijkstra 邻接表
阅读量:4073 次
发布时间:2019-05-25

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

题目描述:

两个人从同一出发点去不同的地方,路的距离会造成花费的多少,所以两个人走的越短越好,并且两个人同乘一辆车可以使花费更低,给出每条路所连接的两个城市及该线路的花费以及两个人的出发点和他们各自的目的地,求他们需要的最小花费是多少

分析:

先同乘一段距离,再分开走,形走路线是一个Y形路线,找出一个点,使他到出发点以及他们各自的目的地三个地方的最短距离的和最小,这三个距离的和就是他们所需的最小距花费

这道题换了三种方法打的,第一种是邻接矩阵 乱入 优先队列,超空间,w[i][j]来储存 i 地到 j 地 的花费 ,后来发现若用邻接矩阵来储存花费,必定超时

超空间代码。。:其实那个spfa函数并不是spfa算法,名字是我乱入的。

#include
#include
#include
#include
#include
#include
using namespace std;const int maxn=1010;const int INF=0x1f1f1f1f;const int INF1=1<<25-1;int dislena[maxn];int dislenb[maxn];int dislenc[maxn];int w[maxn][maxn];bool visit[maxn];vector
G[maxn];int n,m;int s,t;struct HeapNode{ int d,u; bool operator<(const HeapNode & rhs)const { return d>rhs.d; }};void spfa(int s,int * dislen){ int i,j; for(i=1; i<=n; i++) { if(i==s) { dislen[i]=0; } else { dislen[i]=w[s][i]; } } priority_queue
Q; memset(visit,0,sizeof(visit)); HeapNode tt; tt.d=0; tt.u=s; Q.push(tt); while(!Q.empty()) { HeapNode x=Q.top(); Q.pop(); int u=x.u; if(visit[u]) continue; visit[u]=true; for(i=0;i
=dislen[u]+w[u][v]) { dislen[v]=dislen[u]+w[u][v]; HeapNode t; t.d=dislen[v]; t.u=v; Q.push(t); // Q.push((HeapNode){dislen[v],v}); } } }}int main(){ int cnt=1; while(scanf("%d",&n)!=EOF) { scanf("%d",&m); if(n==0&&m==0) break; int i,j; memset(w,0x1f,sizeof(w)); for(i=0;i<=n;i++) { G[i].clear(); } int c,a,b; scanf("%d%d%d",&c,&a,&b); int u,v,len; //cout<<"m== "<
<
=len) { w[u][v]=len; w[v][u]=len; G[u].push_back(v); G[v].push_back(u); } } //cout<<"this is a good end"<
第二种:已AC

正宗的邻接表,head[u]数组用来储存 u 这个点与其相连的边的编号,Arc数组里保存了相邻的点v和dis[u][v],以及下一个与u相邻的点v1所在的边的编号, 这样可以找到dis[u][v1],当。next_arc==-1时,点u相邻的点已经全部找完。碰到一个问题,不知道为什么,dij函数里加k变量的话就ac,不加的话就超时;

代码:

//m远小于n^2,故邻接矩阵超时,时间复杂度n^2,适用于稠密图,而当m远小于n^2时,可用于邻接表#include
#include
#include
#include
#include
#include
using namespace std;const int maxn=20010;const int INF=0x1f1f1f1f;const int INF1=1<<25-1;int dislena[5010];int dislenb[5010];int dislenc[5010];bool visit[5010];int n,m;int s,t;struct Str{ int num; int cost; Str(int a,int b):num(a),cost(b){} bool operator <(const Str & res)const { return cost>res.cost; }};struct Arc{ int next_arc; int point; int cost;};Arc arc[maxn];int head[5010];void dij(int src,int n,int *low){ memset(visit,0,sizeof(visit)); priority_queue
q; Str str1(src,0); q.push(str1); int k=0; while(k

第三种:

用G[u][i]表示u点相连的点v在所在的边edges[G[u][i]],其实与第二种很像;

代码:已AC

//m远小于n^2,故邻接矩阵超时,时间复杂度n^2,适用于稠密图,而当m远小于n^2时,可用于邻接表#include
#include
#include
#include
#include
#include
using namespace std;const int INF=0x1f1f1f1f;const int INF1=1<<25-1;int dislena[5010];int dislenb[5010];int dislenc[5010];int n,m;struct Edge{ int from; int to; int dist; Edge(int u,int v,int d):from(u),to(v),dist(d) {}};vector
edges;vector
G[5010];bool visit[5010];void init(){ for(int i=0; i<=n; i++) { G[i].clear(); } edges.clear();}void AddEdge(int from,int to,int dist){ edges.push_back(Edge(from,to,dist)); int m=edges.size(); G[from].push_back(m-1);}struct HeapNode{ int d; int u; bool operator< (const HeapNode & rhs )const { return d>rhs.d;}};void dij(int src,int n,int *low){ memset(visit,0,sizeof(visit)); priority_queue
q; for(int i=0;i<=n;i++) low[i]=INF; low[src]=0; q.push((HeapNode){0,src}); //cout<<"src== "<
<
low[u]+e.dist) { low[e.to]=low[u]+e.dist; q.push((HeapNode){low[e.to],e.to}); } } }}int main(){ int cnt=1; while(scanf("%d",&n)!=EOF) { init(); scanf("%d",&m); if(n==0&&m==0) break; int i,j; int c,a,b; scanf("%d%d%d",&c,&a,&b); int u,v,len; for(i=1; i<=m; i++) { scanf("%d%d%d",&u,&v,&len); AddEdge(u,v,len); AddEdge(v,u,len); } //cout<<"this is one"<

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

你可能感兴趣的文章
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
Encoding Schemes
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Java8 HashMap集合解析
查看>>
自定义 select 下拉框 多选插件
查看>>
linux和windows内存布局验证
查看>>
Linux常用统计命令之wc
查看>>
fastcgi_param 详解
查看>>
搞定Java面试中的数据结构问题
查看>>
linux内核学习(7)脱胎换骨解压缩的内核
查看>>
慢慢欣赏linux 内核模块引用
查看>>
kprobe学习
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>