Dijkstra模板

Posted 君凌烟阁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dijkstra模板相关的知识,希望对你有一定的参考价值。

 Dijkstra是求最短路径,从未选过点中找最短的一条路,然后更新其他点到起点的距离。例如选择的最短点为k,则dj[k]表示起点到k之间的距离,此时更新其他点到起点的距离,dj[j] = min(dj[j],dj[k]+dj[k][j]);dj[j]比较原来的长度与经过k掉再到j点的长度,取最小。

模板如下:

技术分享
void Dijkstra()
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<=n;++i)
        dj[i] = Map[0][i];
    vis[0] = 1;
    for(int i=1;i<=n;++i)
    {
        int mindj = INF;
        int pos;
        for(int j=1;j<=n;++j)
        {
            if(dj[j]<mindj&&!vis[j])
            {
                mindj = dj[j];
                pos = j;
            }
        }
        vis[pos] = 1;
        for(int j=1;j<=n;++j)
        {
            if(!vis[j] && dj[j] > dj[pos] + Map[pos][j])
                dj[j] = dj[pos] + Map[pos][j];
        }
    }
}
View Code

 

hdu2066

由于多个起点,只要设置多个起点到0起点的距离为0即可。

技术分享
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF (1<<30)
#define N   (1000+100)

int Map[N][N];
int n;
int dj[N],vis[N];


void Dijkstra()
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<=n;++i)
        dj[i] = Map[0][i];
    vis[0] = 1;
    for(int i=1;i<=n;++i)
    {
        int mindj = INF;
        int pos;
        for(int j=1;j<=n;++j)
        {
            if(dj[j]<mindj&&!vis[j])
            {
                mindj = dj[j];
                pos = j;
            }
        }
        vis[pos] = 1;
        for(int j=1;j<=n;++j)
        {
            if(!vis[j] && dj[j] > dj[pos] + Map[pos][j])
                dj[j] = dj[pos] + Map[pos][j];
        }
    }
}

int main()
{
    int t,s,d;
    while(~scanf("%d%d%d",&t,&s,&d))
    {
        n = 0;
        for(int i=0;i<N;++i)
            for(int j=0;j<N;++j)
            {
                if(i != j)  Map[i][j] = INF;
                else Map[i][j] = 0;
            }
        for(int i=0;i<t;++i)
        {
            int a,b,time;
            scanf("%d%d%d",&a,&b,&time);
            Map[a][b] = Map[b][a] = min(Map[a][b],time);
            n = max(max(a,b),n);
        }
        int src[N],dst[N];
        for(int i=0;i<s;++i)
        {
            scanf("%d",&src[i]);
            Map[0][src[i]] = 0;
        }
        for(int i=0;i<d;++i)
            scanf("%d",&dst[i]);
        Dijkstra();
        int res = INF;
        for(int i=0;i<d;++i)
            res = min(res,dj[dst[i]]);
        printf("%d\n",res);
    }
    return 0;
}
View Code

 

以上是关于Dijkstra模板的主要内容,如果未能解决你的问题,请参考以下文章

AcWing 850. Dijkstra求最短路 II(Dijkstra稠密图堆优化模板)

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段1——vue主模板

VSCode自定义代码片段2——.vue文件的模板

VSCode自定义代码片段(vue主模板)

Dijkstra 模板 最短路