#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#define per(i,a,b) for(int i=a;i<b;i++)
#define rep(i,b,a) for(int i=b;i>a;i--)
using namespace std;
const int N=1e4+5;
const int INF=1<<25;
int n,u,v,w;
struct node{
int v;
int c;
node (int _v=0,int _c=0):v(_v),c(_c){}//
bool operator<(const node &r)const{
return c>r.c;
}
};//数越小优先级越高
struct Edge{
int v,cost;
Edge(int _v=0,int _cost=0):v(_v),cost(_cost){};
};//下一个结点和权值
vector<Edge>E[N];
bool vis[N];
int dist[N];
void Dijkstra(int n,int start){
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++) dist[i]=INF;
priority_queue<node>que;
while(!que.empty()) que.pop();//优先队列置空
dist[start]=0;
que.push(node(start,0));
node tmp;
while(!que.empty()){
tmp=que.top();
que.pop();
int u=tmp.v;
if(vis[u]) continue;
vis[u]=true;
for(int i=0;i<E[u].size();i++){
int v=E[u][i].v;
int cost =E[u][i].cost;
if(!vis[v]&&dist[u]+cost<dist[v]){//判断直接和绕过另一个那个进
dist[v]=dist[u]+cost;
que.push(node(v,dist[v]));
}
}
}
}
int main(){
int n,k;
ios::sync_with_stdio(false);
cin>>n;
for(int i=0;i<n;i++){
cin>>u>>k;
per(i,0,k){
cin>>v>>w;
E[u].push_back(Edge(v,w));
}
}
Dijkstra(n,0);
for(int i=0;i<n;i++)
cout<<i<<" "<<dist[i]<<endl;
return 0;
}
Aizu - ALDS1_12_C:Dijkstra +堆优化
于 2018-10-01 18:52:14 首次发布
