思想是:将未被收录的点放入一个优先级队列当中,每次队首元素就是这次要收录的点
测试样例
#include <iostream> #include <queue> #include <stdio.h> #include <vector> using namespace std; struct node { int num,dis; node(int nn,int dd):num(nn),dis(dd) {} friend bool operator <(const node &a,const node &b) { if(a.dis==b.dis) return a.num<b.num; else return a.dis>b.dis; } }; int N,R; int dist[105]; int path[105]; const int IN = 1<<30; vector<node> G[105]; priority_queue<node> q; int MinDis; int dij() { MinDis = IN; for(int i=1; i<=N; i++) dist[i] = IN; dist[1] = 0; q.push(node(1,0)); while(!q.empty()) { node now = q.top(); q.pop(); for(int i=0; i<G[now.num].size(); i++) { node p = G[now.num][i]; if(now.dis + p.dis <dist[p.num]) { path[p.num] = now.num; dist[p.num] = now.dis + p.dis; q.push(node(p.num,dist[p.num])); } } } } int main() { cin >> N >> R; int source,desin,dis; while(R--) { cin >> source >> desin >> dis; G[source].push_back(node(desin,dis)); G[desin].push_back(node(source,dis)); } dij(); for(int i=1;i<=N;i++) cout<<dist[i]<<endl; return 0; }