dijkstra 算法
朴素版dijkstra O(n^2) 用于稠密图
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 510;
int n,m;
int g[N][N],dist[N];
bool st[N];
int dijstra(){
memset(dist,0x3f,sizeof(dist));
dist[1]=0;
for(int i=0;i<n;i++){
int t=-1;
for(int j=1;j<=n;j++)
if(!st[j]&&(t==-1||dist[t]>dist[j]))
t=j;
st[t]=true;
for(int j=1;j<=n;j++)
dist[j]=min(dist[j],dist[t]+g[t][j]);
}
if(dist[n]==0x3f3f3f3f) return -1;
return dist[n];
}
int main(){
scanf("%d%d",&n,&m);
memset(g,0x3f,sizeof(g));
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b]=min(g[a][b],c);
}
int t = dijstra();
printf("%d",t);
return 0;
}
堆优化版Dijkstra算法 O(mlogn) 用于稀疏图
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const int N = 1e6+10;
typedef pair<int,int> PII;
int n,m;
int h[N],e[N],w[N],ne[N],idx;
int dist[N];
bool st[N];
void add(int a,int b,int c){
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
int dijkstra(){
memset(dist,0x3f,sizeof(dist));
dist[1]=0;
priority_queue<PII,vector<PII>,greater<PII>> heap;
heap.push({0,1});
while(heap.size()){
PII t = heap.top();
heap.pop();
int distance=t.first,a=t.second;
if(st[a]) continue;
st[a]=true;
for(int i=h[a];i!=-1;i=ne[i]){
int j=e[i];
if(dist[j]>dist[a]+w[i]){
dist[j]=dist[a]+w[i];
heap.push({dist[j],j});
}
}
}
if(dist[n]==0x3f3f3f3f) return -1;
return dist[n];
}
int main(){
scanf("%d%d",&n,&m);
memset(h,-1,sizeof(h));
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
cout << dijkstra() << endl;
return 0;
}

浙公网安备 33010602011771号