题目:见算法笔记第375页
输入数据
6 8 0
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
一下是用邻接表存储
#include<iostream>
#include<string>
#include<algorithm>
#include<bits/stdc++.h>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<deque>
#include<cctype>
#include<unordered_set>
#include<unordered_map>
#include<fstream>
using namespace std;
int n,m,s,p;
const int maxn=501;
bool vis[maxn]={false};
int d[maxn];
int c[maxn];
const int inf=1e9;
struct Node{
int v,dis;//v为目标顶点,dis为边权值
};
vector<Node>adj[maxn];
void Dijkstra(int s){
fill(d,d+maxn,inf);
d[s]=0;
for(int i=0;i<n;i++){
int u=-1,minn=inf;
for(int j=0;j<n;j++){
if(!vis[j]&&d[j]<minn){
minn=d[j];
u=j;
}
}
if(u==-1)return ;
vis[u]=true;
for(int j=0;j<adj[u].size();j++){
int v=adj[u][j].v;
if(vis[v]==false&&d[v]>d[u]+adj[u][j].dis){
d[v]=d[u]+adj[u][j].dis;
}
}
}
}
int main(){
cin>>n>>m>>s;
for(int i=0;i<m;i++){
int x,y,dis;
cin>>x>>y>>dis;
adj[x].push_back(Node{y,dis});
}
Dijkstra(s);
for(int i=0;i<n;i++){
cout<<d[i]<<" ";
}
return 0;
}