POJ 1251 Jungle Roads ( Prim , Kruscal )

基礎的最短路,只是初始化麻煩一些。。

不過剛開始老 TEL。。看了discuss 。。才知道數據有問題。。呃。。 改成cin 和cout 就過了。。不過。。。是有空該好好學學C++了= = 


//252K 0MS
#include <stdio.h>
#include <iostream>
#include <cstdio>
#define MAX_COST 105
#define N 28
#define DEBUG puts("debug")
using namespace std ;
int dis_betw[N][N] ;
int low_dis[N] ;
int flag[N] ;

void Init_Dis_Betw ( )
{
    int i ;
    for ( i = 0 ; i < N ; i ++ )
    {
        int j ;
        for ( j = 0 ; j < N ; j ++ )
        {
            dis_betw[i][j] = MAX_COST ;
        }
    }
}

void Init_Flag_And_Low_Dis ( )
{
    int i ;
    for ( i = 0 ; i < N ; i ++ )
    {
        flag[i] = 0 ;
        low_dis[i] = MAX_COST ;
    }
}

void Reachable_Matrix ( int const n )
{
    int i ;
    for ( i = 1 ; i <= n-1 ; i ++ )
    {
       char row ;
       cin >> row ;
       int row_index ;
       row_index = row - 'A' + 1 ;
       int count ;
       //scanf ("%d" , & count ) ;
       cin >> count ;
      // getchar ( ) ;
       while ( count -- )
       {
           char rank ;
           //scanf ("%c" , & rank ) ;
           cin >> rank ;
           int rank_index ;
           rank_index = rank - 'A' + 1 ;
           int length ;
           //scanf ("%d" , & length ) ;
           cin >> length ;
        //   getchar ( ) ;
           dis_betw[row_index][rank_index] = dis_betw[rank_index][row_index] = length ;
       }
    }
}


void Prime ( int const n )
{
    int s ;
    s = 1 ;
    Init_Flag_And_Low_Dis ( ) ;
    flag[1] = 1 ;
    int prim_weight ;
    prim_weight = 0 ;
    int m ;
    m = 1 ;
    int new_point ;
    int new_weight ;
    while ( m < n )
    {
        new_weight = MAX_COST ;
        int i ;
        for ( i = 1 ; i <= n  ; i ++ )
        {
            if ( 0 == flag[i] && low_dis[i] > dis_betw[s][i] )
            {
                low_dis[i] = dis_betw[s][i] ;
            }
            if ( 0 == flag[i] && new_weight > low_dis[i] )
            {
                new_weight = low_dis[i] ;
                new_point = i ;
            }
        }
        s = new_point ;
        flag[s] = 1 ;
        prim_weight += new_weight ;
        m ++ ;
    }
    cout << prim_weight << endl ;
}

int
main ( )
{
    int n ;
    while ( 1 )
    {
        cin >> n ;
        if ( 0 == n )
        {
            break ;
        }
      //  getchar ( ) ;
        Init_Dis_Betw ( ) ;
        Reachable_Matrix ( n ) ;
        Prime ( n ) ;
    }
    return 0 ;
}




發佈了50 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章