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

dijkstra

时间:2019-01-21 15:58:05      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:val   最短路径   最小值   code   space   int   路径   push   return   

#include<cstdio>
#include<queue>
using namespace std;
int val[200020],dis[100010],vis[200020],head[100010],nxt[200020],to[200020];
int n,m,s,k;

struct pot  //x-顶点 dis-最短路径 
{
    int x,dis;
    pot(int _x=0,int _dis=0):x(_x),dis(_dis){}
    friend bool operator < (pot a,pot b)
    {
        return a.dis>b.dis;
    }
};
priority_queue<pot> que;  //定义一个堆 

void dijkstra()   //定义dijkstra函数 (仅用一步不用递归递推什么的) 
{
    for(int i=1;i<=n;i++) dis[i]=2e9; //初始值使所有点无穷大 
    que.push(pot(s,0));     //s 出发点 自己到自己 距离为 0 同时也是最小值 
    dis[s]=0;
    while(!que.empty())
    {
        pot now;
        now=que.top();
        que.pop();
        if(vis[now.x]) continue;
        vis[now.x]=true;
        for(int i=head[now.x];i;i=nxt[i])
        {
            if(dis[to[i]]>dis[now.x]+val[i])
            {
                dis[to[i]]=dis[now.x]+val[i];
                que.push(pot(to[i],dis[to[i]]));
            }
        }
    }
}

void add(int a,int b,int c)     //一波加边的操作 
{
    k++;                       //给新加入的边编号 
    nxt[k]=head[a];       
    to[k]=b;              //指向的点 
    val[k]=c;             //边权值 
    head[a]=k;            //head 从u点出发的第一条边  
}

int main()
{
    int a,b,c;
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
    }
    dijkstra();
    for(int i=1;i<=n;i++) printf("%d ",dis[i]);
    return 0;
}

 

dijkstra

标签:val   最短路径   最小值   code   space   int   路径   push   return   

原文地址:https://www.cnblogs.com/darlingroot/p/10298408.html

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