链式前向星

nextnextnext指的是上一条同起点边的位置,tototo表示这条边的终点,valvalval表示边权。

u、v、valu、v、valu、v、val分别表示起点,终点,边权。

head[x]head[x]head[x]存以xxx为起点的,最后加入的边的位置edge[edge[u]]edge[edge[u]]edge[edge[u]]

struct node{int next,to,val;
}edge[maxn];
int head[maxn];
int tot=0;
head[x]=-1;
void add(int u,int v,int val){edge[++tot].to=v;edge[tot].val=val;edge[tot].next=head[u];head[u]=tot;
}

dij堆优化

priority_queue<pii,vector<pii >,greater<pii > >qp;
int dis[maxn],vis[maxn];
void dijkstra(int src){for(int i=1;i<=n;++i){dis[i]=INF;}dis[src]=0;qp.push({0,src});while(!qp.empty()){pii t=qp.top;qp.pop();int u=t.second;if(vis[u])continue;vis[u]=1;for(int i=head[u];i;i=edge[i].next){if(dis[edge[i].to]>dis[u]+edge[i].val){dis[edge[i].to]=dis[u]+edge[i].val;qp.push({dis[edge[i].to],edge[i].to});}}}
}

链接:https://ac.nowcoder.com/acm/problem/14550
来源:牛客网

题目描述

小z放假了,准备到RRR城市旅行,其中这个城市有N个旅游景点。小z时间有限,只能在三个旅行景点进行游玩。小明租了辆车,司机很善良,说咱不计路程,只要你一次性缴费足够,我就带你走遍RRR城。

小z很开心,直接就把钱一次性缴足了。然而小z心机很重,他想选择的路程尽量长。

然而司机也很聪明,他每次从一个点走到另外一个点的时候都走最短路径。

你能帮帮小z吗?

需要保证这三个旅行景点一个作为起点,一个作为中转点一个作为终点。(一共三个景点,并且需要保证这三个景点不能重复).

输入描述:

本题包含多组输入,第一行输入一个整数t,表示测试数据的组数
每组测试数据第一行输入两个数N,M表示RRR城一共有的旅游景点的数量,以及RRR城中有的路的数量。
接下来M行,每行三个数,a,b,c表示从a景点和b景点之间有一条长为c的路
t<=40
3<=N,M<=1000
1<=a,b<=N
1<=c<=100

输出描述:

每组数据输出两行,
每组数据包含一行,输出一个数,表示整条路程的路长。
如果找不到可行解,输出-1.

思路:

遍历中转点,找出和中转点距离最大的两个地方分别作为起点和终点。

我选择了链式前向星+dij

链式前向星遍历时采用

for(int i=head[u];i;i=edge[i].next){}
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define DOF 0x7f7f7f7f
#define endl '\n'
#define mem(a,b) memset(a,b,sizeof(a))
#define debug(case,x); cout<<case<<"  : "<<x<<endl;
#define open freopen("ii.txt","r",stdin)
#define close freopen("oo.txt","w",stdout)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<long long,long long> PII;
const int maxn = 2e5 + 10;
int n,m;
int dis[maxn],vis[maxn];
priority_queue<pii,vector<pii >,greater<pii> >qp;
struct edge{int next;int to;int val;
}edge[maxn];
int head[maxn];
int tot=0;
void add(int u,int v,int val){edge[++tot].to=v;edge[tot].val=val;edge[tot].next=head[u];head[u]=tot;
}int dij(int src){while(!qp.empty())qp.pop();for(int i=1;i<=n;++i){dis[i]=INF;vis[i]=0;}dis[src]=0;qp.push({0,src});int x=0,y=0;while(!qp.empty()){pii t=qp.top();qp.pop();int u=t.second;if(vis[u])continue;vis[u]=1;y=max(y,dis[u]);if(y>x)swap(x,y);for(int i=head[u];i;i=edge[i].next){if(vis[edge[i].to])continue;if(dis[edge[i].to]>dis[u]+edge[i].val){dis[edge[i].to]=dis[u]+edge[i].val;qp.push({dis[edge[i].to],edge[i].to});}}}if(!y)return 0;else return x+y;
}int main(){int t;cin>>t;while(t--){cin>>n>>m;for(int i=1;i<=n;++i)head[i]=-1;int a,b,c;while(m--){cin>>a>>b>>c;add(a,b,c);add(b,a,c);}int ans=-1;for(int i=1;i<=n;++i){ans=max(dij(i),ans);}if(ans)cout<<ans<<endl;else cout<<-1<<endl;}
}

链式前向星dij堆优化相关推荐

  1. AcWing 4246. 最短路径和(反向建图+链式前向星+堆优化)

    题目连接 https://www.acwing.com/problem/content/description/4249/ http://poj.org/problem?id=1511 思路 其实这道 ...

  2. HDU1535 Invitation Cards(链式前向星+堆优化dijkstra)[C++]

    目录 题目及翻译 题面 输入 输出 输入样例 输出样例 题目思路 注意事项 AC代码 C++ 题目及翻译 题面 In the age of television, not many people at ...

  3. 迪杰斯特拉最全详解(朴素版,堆优化+邻接表存图/链式前向星存图)

    迪杰斯特拉 迪杰斯特拉算法分析 迪杰斯特拉(朴素版) 迪杰斯特拉堆优化(邻接表存图) 迪杰斯特拉堆优化(链式前向星存图) 最短路--spfa(链式前向星存图) 迪杰斯特拉算法分析 一般用三种数据结构存 ...

  4. Djisktra + 链式前向星建图 + PriorityQueue堆优化【附Java代码模板题解】

    Djisktra堆优化(链式前向星)

  5. PTA: 旅游规划 [狄杰斯特拉+堆优化+链式前向星]

    题目 输入样例: 4 5 0 3 0 1 1 20 1 3 2 30 0 3 4 10 0 2 2 20 2 3 1 20 输出样例: 3 40 思路 狄杰斯特拉几乎算是模版题.练了一下链式前向星. ...

  6. Balkan2007]Toponyms[链式前向星建字典树+getchar()读入优化]

    思路容易想,卡空间和时间就吐了 用链式前向星压缩空间,用getchar()一位一位读加快读入 #include <iostream> #include <cstdio> #in ...

  7. 蓝桥集训之BFS、DFS和链式前向星

    配套视频 https://www.bilibili.com/video/BV1RD4y1F7Fq 一.建图基础 前言 图一般定义为二元集: 由顶点集与边集构成. 或者更抽象的说,由一个集合(顶点),和 ...

  8. 数据结构【链式前向星】

    第一次接触链式前向星是在学习图论的迪杰斯特拉算法时,大佬们纷纷用链式前向星+堆优化+迪杰斯特拉解题,秀的我萌新懵的一批,当时不知道啥是链式前向星,不过随着越来越深入,这种结构见得越来越多,慢慢的就明白 ...

  9. 图论:SPFA 算法详解( 算法竞赛入门到进阶) HDU 2544 链式前向星 【提供ACM模板+图解,不会都难!】

    文章目录 SPFA简介 链式前向星介绍 SPFA算法思路详细 模板-链式前向星 参考书籍:算法竞赛入门到进阶 罗勇军 SPFA简介 用队列处理Bellman-Ford算法可以很好地优化,这种方法叫做S ...

最新文章

  1. 《智源社区周刊:预训练模型》第1期:吴恩达团队医疗影像预训练、快手落地万亿参数模型...
  2. mysql安全无密码登录_技术分享 | 安全地无密码登录 MySQL
  3. 电商泛滥的时代,我们的出路在哪里?
  4. python构建区块链_用python构建区块链(1)---基本结构
  5. c++string替换指定位置字符_Excel数据分析:如何替换字符串中的指定字符?
  6. 30%企业定位平台型,不会出现类似BAT巨头
  7. win10查看pcie设备_壹拓网科技解密WIN10系统使用向日葵开机棒远程开机需要设置几个地方...
  8. 使用juniversalchardet做字符编码识别
  9. Android应用开发—知识点汇总
  10. 选轻量应用服务器or云服务器ECS?一图帮你彻底区分
  11. linux线程同步教程,多线程同步
  12. POJ 1639 Picnic Planning:最小度限制生成树
  13. linux系统获取光盘信息api,C++ 通过WIN32 API 获取逻辑磁盘详细信息的几种方法
  14. cs4.1 编译与安装
  15. mvc创建连接mysql_五、 创建连接串连接本地数据库(ASP.NET MVC5 系列)
  16. 求助:如何得知文件下载了多少大?
  17. k2p 高恪魔改固件
  18. MIDIPLUS STUDIO M S 2 4声卡安装调试教程
  19. matlab偏最小二乘法及其检验
  20. 元宇宙产业化还很遥远

热门文章

  1. 硬件开发总结笔记一:电阻
  2. 慧居科技在港交所上市状态“失效”,双良科技为控股股东
  3. 蘑菇街后台开发实习二面(视频面)
  4. 两年,从纯小白到腾讯阿里,应届非计算机毕业生的2014互联网求职之路(转)...
  5. 推荐35个非常有创意的404错误页面
  6. 神级操作丨用 Python 将微信热文转换成Word文档
  7. Goolge Colab免费GPU服务器使用教程
  8. Python:实现integer partition整数分区算法(附完整源码)
  9. windows下批处理文件bat怎么写?
  10. 向氏-姓氏家谱知识图谱构建