===================================================================
/**
思路: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);
}
#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)]