(Acwing算法基础课)——图论之朴素迪杰斯特拉算法

图论之朴素迪杰斯特拉

1.原题地址

之前自己蓝桥杯拿到省二第一名,非常遗憾没有进入决赛的原因就是图论的两个题目一个都不会写,因为自己但是做完了往前十年的题目,省赛都是没有考过图论的,所以我当时打算的就是进入决赛之后再学习图论,没想今年蓝桥杯的题目风格大变,让我措手不及,也酿成了我大三最大的遗憾,所以我打算再准备一年,反正保研了大四会轻松些,我一定要拿到国奖!
附上Acwing上的该题链接:
Acwing849朴素迪杰斯特拉Ⅰ

2.数据结构和算法思路

适用于稠密图,用邻接矩阵

双重循环O(n^2)

数据结构:

  • 二维数组map,该算法用于稠密图,用二维数组存储
  • s[t],存储当前这个点有没有加入到已经找到最短路的集合中
  • d[n],存储各个点到1号点的距离

算法:

  • 初始化:到一号点(自己)的距离为0,到其余点的距离为负无穷
  • 外层for循环,遍历每一个点
  • 内层for循环,遍历找到没有在(已找到最短距离的)集合中的距离最短的点,并将其加入集合
  • 用刚刚加入集合的点更新其他点到1号点的距离

3.AC代码

#include
#include
#include

using namespace std;
const int N=510;
int map[N][N];
int s[N];
int d[N];
int n,m;


int Dijkstra(){
    memset(d,0x3f,sizeof(d));
    d[1]=0;
  
    for(int i=0;i>n>>m;
    int a,b,c;
    
    while(m--){
        cin>>a>>b>>c;
        map[a][b]=min(map[a][b],c); //有向边
    }
    
    int ans=Dijkstra();
    cout<

你可能感兴趣的:(Acwing算法基础课,算法,图论,数据结构)