[Aha]單源最短路

題目:詳見啊哈算法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 ;
}
發佈了52 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章