朴素版本
void dijkstra(int s)
{
int vis[n];
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
dis[i]=m[s][i];
}
dis[s]=0;
vis[s]=1;
int now;
for(int j=2;j<=n;j++)
{
int mindis=inf;
for(int i=1;i<=n;i++)
{
if(vis[i]==0&&dis[i]<mindis)
{
mindis=dis[i];
now=i;
}
}
vis[now]=1;
for(int i=1;i<=n;i++)
{
if(m[now][i]<inf)
if(dis[now]+m[now][i]<dis[i])
{
dis[i]=dis[now]+m[now][i];
}
}
}
}
堆优化+pair
#include<bits/stdc++.h>
#define maxn 20000
#define inf 2147483647
using namespace std;
typedef pair<int,int>P;//first是最短距离,second是顶点的编号
priority_queue<P,vector<P>,greater<P> >que;
int dis[maxn];
int n,m,s;
struct edge
{
int to,cost;
};
vector<edge> G[maxn];
void dijkstra(int s)
{
for(int i = 1; i <= n; i++)
dis[i] =inf;
dis[s]=0;
que.push(P(0,s));//起点入队
while(!que.empty())
{
P p=que.top();//取出最后入队的点
que.pop();
int v=p.second; //起点的编号
// cout<<v<<endl;
if(dis[v]<p.first)continue;//已经遍历过了并且是目前最短路
for(int i=0;i<G[v].size();i++)//size==从这个点出发的有多少条路
{
edge e=G[v][i];//从v出发的第i条路
if(dis[e.to]>dis[v]+e.cost)
{
dis[e.to]=dis[v]+e.cost;
que.push(P(dis[e.to],e.to));
//cout<<dis[e.to]<<endl;
}
}
}
}
int main()
{
cin >> n >> m >> s;
int from, to, cost;
edge in;
for(int i = 0; i < m; i++)
{
scanf("%d%d%d",&from ,&to ,&cost);
in.to = to; in.cost = cost;
G[from].push_back(in);
}
dijkstra(s);
for(int i = 1; i <= n; i++)
printf("%d ", dis[i]);
return 0;
}
SPFA
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
vector<pair<int,int> >Road[maxn];
int dis[maxn],is_queue[maxn];//起点到个点的距离,是否入队
void init()
{
for(int i=0;i<maxn;i++)Road[i].clear();
for(int i=0;i<maxn;i++)is_queue[i]=0;
for(int i=0;i<maxn;i++)dis[i]=1e9;
}
int n,m;//点数和边数
int main()
{
while(cin>>n>>m)
{
init();
for(int i=0;i<m;i++)
{
int from,to,value;
scanf("%d%d%d",&from,&to,&value);
Road[from].push_back(make_pair(to,value));
Road[to].push_back(make_pair(from,value));
}
int start,end;
scanf("%d%d",&start,&end);
queue<int>Q;
Q.push(start),dis[start]=0,is_queue[start]=1;
//起点入队
while(!Q.empty())
{
int now=Q.front();
Q.pop();
is_queue[now]=0;
for(int i=0;i<Road[now].size();i++)
{
int now2=Road[now][i].first;
if(dis[now2]>dis[now]+Road[now][i].second)
{
dis[now2]=dis[now]+Road[now][i].second;
if(is_queue[now2]==1)continue;
is_queue[now2]=1;
Q.push(now2);
}
}
}
if(dis[end]==1e9)cout<<"-1"<<endl;
else cout<<dis[end]<<endl;
}
return 0;
}
FLOYD
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
if(dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
}
}