题目:详见啊哈算法P155页。
分析:裸dijkstra。
代码:
//dijkstra
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
freopen("in.txt","r",stdin);
int n , m ,inf , a, b , c ,u;
int e[100][100];
int book[100],dis[100];
while(scanf("%d %d",&n,&m)!=EOF){
//初始化
inf = 99999999 ;
int min_n = inf ;
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= n ; j++){
if(i==j) e[i][j] = 0 ;
else e[i][j] = inf ;
}
}
memset(book,0,sizeof(book));
for(int i = 1 ; i <= m ; i++){
scanf("%d %d %d",&a,&b,&c);
e[a][b] = c ;
}
for(int i = 1 ; i <= n ; i++) dis[i] = e[1][i] ;
book[1] = 1 ;
//dijkstra核心
for(int i = 1 ; i <= n-1 ; i++){
min_n = inf ;//记得每次选点初始化min_n
//选择距离1点最近的点,加入最短集合并标记
for(int j = 1 ; j <= n ; j++){
if(book[j] == 0&&dis[j]<min_n){
min_n = dis[j] ;
u = j ;
}
}
book[u] = 1 ;//标记,即加入集合中
//通过该点,松弛1点到与该点相邻的节点的距离
for(int v = 1 ; v <= n ; v++){
if(e[u][v]<inf){
if(dis[v]>dis[u]+e[u][v]) dis[v] = dis[u] + e[u][v] ;
}
}
}
for(int i = 1 ; i <= n ; i++) printf("%d ",dis[i]);
}
return 0 ;
}