POJ 1251 Jungle Roads ( Prim , Kruscal )

4 篇文章 0 订阅

基础的最短路,只是初始化麻烦一些。。

不过刚开始老 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 ;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值