邻接矩阵版
时间复杂度:O(n^2)
空间复杂度:O(n^2)(用邻接矩阵存图)
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N = 1e2+5;//最大N个顶点
const int INF = 1<<30;//1左移30位,等于2^30
int n,m,s,g[N][N];//n个顶点,m条边,g[x][y]表示边x->y的权值
int d[N];//表示起点到顶点的最短距离
bool vis[N]= {0};//标记数组是否已经访问
void dijkstra(int s)//s为起点
{
fill(d,d+N+1,INF);
fill(vis,vis+N+1,0);
d[s]=0;
for(int i=1; i<=n; i++)
{
int u=-1,MIN=INF;//u使得d[u]最小,MIN存该最小d[u]
for(int j=1; j<=n; j++)//找未访问顶点最小的
if(vis[j]==0&&d[j]<MIN)
{
u=j;
MIN=d[j];
}
if(u==-1)return;//未找到说明剩下的顶点与s不连通
vis[u]=1;
for(int v=1; v<=n; v++)
if(vis[v]==0&&g[u][v]!=INF&&d[u]+g[u][v]<d[v])//优化d[v]
d[v]=d[u]+g[u][v];
}
}
int main()
{
int u,v,w;
while(cin>>n>>m>>s)
{
fill(g[0],g[0]+N*N,INF);
for(int i=1; i<=m; i++)
{
cin>>u>>v>>w;
g[u][v]=min(g[u][v],w);//重复则选最短
}
dijkstra(s);
for(int i=1; i<=n; i++)
printf("%d\n",d[i]);//s到i的最短路
}
return 0;
}