Dijkstra 邻接链表+优先队列
Dijkstra 邻接链表+优先队列

代码如下:

#include<iostream>
#include<queue>
#include<stdio.h>
#include<vector>
#define INF 0x3f3f3f3f
#define MAX 10005
using namespace std;

int visit[MAX];
int dis[MAX];
int n,m,s;

typedef pair<int,int> p; //first是最短距离,second是顶点的编号

struct edge{
  int to;
  int cost;
};

vector<edge> adj[MAX];

void dijkstra(int s){
    for(int i=0;i<MAX;i++){
        visit[i]=0;
        dis[i]=INF;
    }
    dis[s]=0;
    priority_queue<p> q;
    q.push(p(0,s));//将源结点放入优先队列
    while(!q.empty()){
        p top=q.top();
        q.pop();
        int u=top.second;
        if(dis[u]<top.first){
            continue;
        }
        for(int i=0;i<adj[u].size();i++){
            edge e=adj[u][i];
            if(dis[e.to]>dis[u]+e.cost){
                dis[e.to]=dis[u]+e.cost;
                q.push(p(dis[e.to],e.to));
            }
        }
    }
}

int main(){
  cin>>n>>m>>s;
  int a,b,len;
  for(int i=0;i<m;i++){
    cin>>a>>b>>len;
    edge e;
    e.to=b;
    e.cost=len;
    adj[a].push_back(e);
  }
  dijkstra(s);
  for(int i=1;i<=n;i++){
    cout<<dis[i]<<' ';
  }
  return 0;
}

相关文章: