Dijkstra算法模板
如题。存模板。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 using namespace std; 6 7 int n,m,s; 8 int hd[100005],to[200005],nx[200005],len[200005],ec; 9 int dis[100005],v[100005]; 10 11 void edge(int af,int at,int el) 12 { 13 to[++ec]=at; 14 len[ec]=el; 15 nx[ec]=hd[af]; 16 hd[af]=ec; 17 } 18 19 struct data 20 { 21 int p,d; 22 friend bool operator < (data w,data e) 23 { 24 return w.d>e.d; 25 } 26 }; 27 28 priority_queue<data>qq; 29 30 void dijkstra() 31 { 32 memset(dis,0x3f,sizeof(dis)); 33 dis[s]=0; 34 qq.push((data){s,0}); 35 while(!qq.empty()) 36 { 37 data nw=qq.top(); 38 qq.pop(); 39 if(v[nw.p])continue; 40 v[nw.p]=1; 41 for(int i=hd[nw.p];i;i=nx[i]) 42 { 43 if((!v[to[i]])&&dis[to[i]]>nw.d+len[i]) 44 { 45 dis[to[i]]=nw.d+len[i]; 46 qq.push((data){to[i],dis[to[i]]}); 47 } 48 } 49 } 50 } 51 52 int main() 53 { 54 scanf("%d%d%d",&n,&m,&s); 55 for(int i=1;i<=m;i++) 56 { 57 int u,v,w; 58 scanf("%d%d%d",&u,&v,&w); 59 edge(u,v,w); 60 } 61 dijkstra(); 62 for(int i=1;i<=n;i++)printf("%d ",dis[i]); 63 return 0; 64 }