題目:詳見啊哈算法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 ;
}