Dijkstra_单源最短路径

http://acm.hdu.edu.cn/showproblem.php?pid=1874

邻接矩阵形式

#include <cstdio>
#include<string.h>
#include <algorithm>
using namespace std;
int graph[210][210];//直接连边距离
int dis[210];//源点到已知最短路径的距离
bool vis[210];
int src,ed,n,m;
const int INF=0x3f3f3f3f;
void init()
{
    memset(vis,0,sizeof(vis));
    memset(graph,INF,sizeof(graph));
    for(int i=0;i<n;i++)
        graph[i][i]=0;
}
void dijkstra()
{
    vis[src]=1;
    dis[src]=0;
    for(int i=0;i<n;i++)
        dis[i]=graph[src][i];
    for(int i=1;i<=n-1;i++)
    {
        int k=-1;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&((k==-1)||(dis[k]>dis[j])))
               k=j;
        }
        if(k==-1) break;
        vis[k]=1;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&(dis[j]>dis[k]+graph[k][j]))
            {
                dis[j]=dis[k]+graph[k][j];
            }
        }

    }
    if(dis[ed]==INF) printf("-1\n");
    else printf("%d\n",dis[ed]);
}
int main()
{
     int u,v,val;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        init();
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&u,&v,&val);
            if(graph[u][v]>val)
            {
                graph[u][v]=val;
                graph[v][u]=val;
            }
        }
        scanf("%d%d",&src,&ed);
        dijkstra();
        //printf("%d\n",INF);

    }
}

前向星+优先队列

#include <cstdio>
#include<string.h>
#include <algorithm>
#include<queue>
#include<vector>
#include<functional>
using namespace std;
typedef pair<int,int> Pair;
const int INF=0x3f3f3f3f;
struct Node
{
    int to,next,w;
}Edge[2010],tmp;
int cnt,head[210],dis[210],src,ed,n,m;
void addEdge(int u,int v,int val)
{
    Edge[cnt].to=v;
    Edge[cnt].w=val;
    Edge[cnt].next=head[u];
    head[u]=cnt++;
}
void init()
{
    memset(head,-1,sizeof(head));
    memset(dis,INF,sizeof(dis));
    cnt=0;
}
void dijkstra()
{
    priority_queue< Pair,vector<Pair>,greater<Pair> > q;
    Pair s;
    s.first=0;
    s.second=src;
    dis[src]=0;
    q.push(s);
    while(!q.empty())
    {
        Pair curr=q.top();
        q.pop();
        int v=curr.second;
        int val=curr.first;
        if(dis[v]<val) continue;
//dis[v]<v.val说明在其他地方对某条u->v边进行了松弛,才导致现在的dis[v]<val;
//然后v节点又一次入队(假设为v*),
//因为v*的val比v的val小,所以肯定是v*先出队列然后对v*的所有出边已经进行了松弛,
//所以现在的v节点已经没有必要对它的出边松弛
        for(int i=head[v];~i;i=Edge[i].next)
        {
            tmp=Edge[i];
            if(dis[tmp.to]>dis[v]+tmp.w)
            {
                dis[tmp.to]=dis[v]+tmp.w;
                q.push(Pair(dis[tmp.to],tmp.to));
            }
        }
    }
    if(dis[ed]==INF) printf("-1\n");
    else printf("%d\n",dis[ed]);
}
int main()
{
     int u,v,val;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        init();
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&u,&v,&val);
            addEdge(u,v,val);
            addEdge(v,u,val);
        }
        scanf("%d%d",&src,&ed);
        dijkstra();
    }
}
    原文作者:Bellman-Ford
    原文地址: https://www.jianshu.com/p/021f4dc86a8f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞