Dijkstra_单源最短路径

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

邻接矩阵形式

#include 
#include
#include 
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;idis[j])))
               k=j;
        }
        if(k==-1) break;
        vis[k]=1;
        for(int j=0;jdis[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;ival)
            {
                graph[u][v]=val;
                graph[v][u]=val;
            }
        }
        scanf("%d%d",&src,&ed);
        dijkstra();
        //printf("%d\n",INF);

    }
}

前向星+优先队列

#include 
#include
#include 
#include
#include
#include
using namespace std;
typedef pair 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,greater > 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]v边进行了松弛,才导致现在的dis[v]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

你可能感兴趣的:(Dijkstra_单源最短路径)