Dijkstra是求單源最短路的一種算法,它不可以處理含有負權邊的圖。本質是遞推,依次求出距離起點最近的點。java
#include<bits/stdc++.h> #define ll long long /* 題目連接:https://www.luogu.com.cn/problem/P3371 */ using namespace std; const int N=5e5+50; const int inf=0x3f3f3f3f; ll n,m,top,s,bad; int e[N][2],nxt[N],hd[20000],dis[20000],vis[20000]; void add(int u,int v,int w){ e[++top][0]=v,e[top][1]=w; nxt[top]=hd[u]; hd[u]=top; } int main() { bad = (1L<<32)-1; cin >> n >> m >> s; for(int i=1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); } priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > pq; pq.push(make_pair(0,s)); memset(dis,0x3f,sizeof(dis)); dis[s]=0; pair<int,int>p; while(pq.size()) { p = pq.top(); pq.pop(); int u=p.second; if(vis[u]) continue; vis[u]=1; for(int ev=hd[u];ev;ev=nxt[ev]) { int v=e[ev][0],w=e[ev][1]; if(dis[u]+w<dis[v]) { dis[v]=dis[u]+w; pq.push(make_pair(dis[v],v)); } } } for(int i=1;i<=n;i++) { if(dis[i]>=inf) { printf("%lld",bad); }else { printf("%d ",dis[i]); } } return 0; }
/* java板子與c++板子並沒有大的區別,這裏主要是寫一下java的priorityqueue的寫法 剩下的其實都同樣。 須要注意的是,java默認的小根堆,而c++默認的是大根堆 */ PriorityQueue<int[]>pq = new PriorityQueue<>( (a,b)->a[0]-b[0] );