ALDS1_12_C:Dijkstra +堆優化
阿新 • • 發佈:2018-12-13
這個題非常值得一做,儘管我用了很長時間
#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; }