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

四:上码

===================================================================

1.用邻接矩阵存储的数据(会出现内存超限)


/**

思路: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;

}

总结

机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。

对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。

你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:

请转发本文支持一下

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

break;

}

总结

机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。

对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。

你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:

请转发本文支持一下

[外链图片转存中…(img-hx9wZcPo-1714256339611)]

[外链图片转存中…(img-THF4Ldoc-1714256339612)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值