码迷,mamicode.com
首页 > 其他好文 > 详细

Dijkstra模板

时间:2017-08-21 14:51:50      阅读:323      评论:0      收藏:0      [点我收藏+]

标签:jks   log   using   ++   void   std   hdu2066   string   长度   

 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模板

标签:jks   log   using   ++   void   std   hdu2066   string   长度   

原文地址:http://www.cnblogs.com/jlyg/p/7404082.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!