7-2 单源最短路径 (10 分)(思路+详解+邻接表做法)Come Brather!!!!!!!!!!


/**

思路:1.首先读题分析到 这是一个有向图

2.单源点最短路径:确定一个点为源点,其到其他点的最短路径;本题当中

因为是有向图,当没有最短路径就不输出了

分析:示例: 4 4

0 1 1

0 3 1

1 3 1

2 0 1

输出为: 1 1

这是0 到 1 的最短路径和0到3的最短路径 而 0到 2无路径 (2到0有路径)

3.本题我用的是临界矩阵储存数据的,而体现贪心的部分是代码中的更新的部分,每次都找最优解

4.具体代码流程需要自己分析示例图解:这里有我分析的无向图的图解,思路和有向图类似

懂了这个就懂了本题的写码思路了

*/

#include<bits/stdc++.h>

using namespace std;

typedef struct Graph * PtrGraph;

typedef struct Graph{

int Nv;

int Ne;

int Date[2276][2274];

} graph;

int infinite = 99999;

//初始化临界矩阵

void CreateGraph(PtrGraph G){

cin >> G->Nv >> G->Ne;

//初始化临界矩阵

for(int i = 0; i < G->Nv; i++){

for(int j = 0; j < G->Nv; j++){

if(i == j){

G->Date[i][j] = 0;

} else{

G->Date[i][j] = infinite;//当两个点不相连的时候为无穷大

}

}

}

//向临界矩阵中赋值

for(int k = 0; k < G->Ne; k++){

int i,j,w;

cin >> i >> j >> w;

G->Date[i][j] = w;//这里体现有向图,即从 i 到 j 在临界矩阵中有值,而从j到i无值

}

}

//验证输出临界矩阵

// void print_Graph(PtrGraph G) {

// for(int i = 0; i < G->Nv; i++){

// for(int j = 0; j < G->Nv; j++){

// cout << G->Date[i][j] << ’ ';

// }

// cout << endl;

// }

// }

//核心代码 体现贪心的代码 每次更新均找距离最短的点

void dijkstra(PtrGraph G){

int dist[2001];//用于存储源点到各个点的最短距离

int visited[2001];//用于记录已经访问了哪个点的

for(int i = 0; i < G->Nv; i++){

dist[i] = G->Date[0][i];//题目给出了源点是 0

}

visited[0] = 1;//表示1已经访问过了

//更新

while(1){

int m = -1;

int min = infinite;

for(int i = 0; i < G->Nv; i++){

if(visited[i] != 1 && dist[i] < min){

min = dist[i];

m = i;

}

}

if(m == -1){//如果m无变化,说明图中的各点已经更新完了

break;

}

visited[m] = 1;

for(int i = 0; i < G->Nv; i++){

if(visited[i] != 1 && min + G->Date[m][i] < dist[i]){//这里注意 min + G->Date[m][i]:

//表示了一个源点到其最短的距离(min)的点,

//然后需要判断这个点到其他点的距离加上min和源点到其他点的距离进行比较更新

dist[i] = min + G->Date[m][i];

}

}

}

for(int i = 1; i < G->Nv; i++){

if(dist[i] == infinite)

continue;

else{

cout << dist[i] << ’ ';

}

}

}

int main(){

PtrGraph G = (PtrGraph)malloc(sizeof(struct Graph));

CreateGraph(G);

// print_Graph(G);

dijkstra(G);

}

2:用邻接表存的正确结果


#include<bits/stdc++.h>

using namespace std;

#define max 20001

struct Node{

int to;//指向边的结点

int val;//边的权值

int next;//指向下一个结点的下标

} node[max];

int head[max],n,m,num = 0;

int infinite = 99999;

//建立邻接表

void add(int from,int to,int val){

num++;

node[num].to = to;

node[num].val = val;

node[num].next = head[from];

head[from] = num;//更新head的值,当再有从from连接的点 它的下一个为 num 坐标

}

//dij算法

void dijkstra(){

int dist[max];

fill(dist, dist + 20001, infinite);

int vis[max] = {0};

for(int i = head[0]; i != 0; i = node[i].next){//这里是选取源点为0的顶点,将和其相连边的权值存进去了

dist[node[i].to] = node[i].val; //比如:0到1:即 node[i].to = 1表示的是顶点, node[i].val = 1 表示0到1这条边的权值为1;dist[1] = 1

}

vis[0] = 1;

while(1){

int m = -1;

int min = infinite;

for(int i = 0; i < n; i++){

if(vis[i] != 1 && dist[i] < min){

min = dist[i];

m = i;

}

}

if(m == -1){//已经遍历完了所有结点

break;

}

vis[m] = 1;

//确定m这个顶点 接下来遍历 m这个结点的链表

for(int i = head[m]; i != 0; i = node[i].next){

if(vis[node[i].to] != 1 && min + node[i].val < dist[node[i].to]){//vis[node[i].to] != 1如果出现 1到2 和2到1这种情况,那么当1已经遍历过,在顶点为2的这个链表中就不用再遍历了

dist[node[i].to] = min + node[i].val;

}

}

}

for(int i = 0; i < n; i++){

if(dist[i] != infinite){

cout << dist[i] << ’ ';

}

}

}

int main(){

memset(head,0,sizeof(head));

cin >> n >> m;

for(int i = 0; i < m; i++){

int from,to,val;

cin >> from >> to >> val;

add(from,to,val);

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

分享

这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!

薪酬缩水,“裸辞”奋战25天三面美团,交叉面却被吊打,我太难了

Spring Cloud实战

薪酬缩水,“裸辞”奋战25天三面美团,交叉面却被吊打,我太难了

Spring Boot实战

薪酬缩水,“裸辞”奋战25天三面美团,交叉面却被吊打,我太难了

面试题整理(性能优化+微服务+并发编程+开源框架+分布式)
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
img.cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

分享

这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!

[外链图片转存中…(img-yPwpkX2f-1713057756256)]

Spring Cloud实战

[外链图片转存中…(img-bLxoo1pw-1713057756256)]

Spring Boot实战

[外链图片转存中…(img-q92ykjqC-1713057756256)]

面试题整理(性能优化+微服务+并发编程+开源框架+分布式)
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值