最短路径

#include <stdio.h>
#include <string.h>
 
int
d [ 1002 ], n , m ;
int
edges [ 1005 ][ 1005 ];
int
queue [ 1000001 ];
#define MAX 999999999
#define N 1001
void dijkstra (int v )
{

        int
i , j ;
        int
s [ N ]={ 0 };
        for
(
i = 1 ; i <= n ; i ++)
                d
[ i ]= edges [ v ][ i ];
        d
[ v ]= 0 ; s [ v ]= 1 ;
        for
(
i = 1 ; i < n ; i ++)
        {

                int
temp = MAX ;
                int
u = v ;
                for
(
j = 1 ; j <= n ; j ++)
                        if
((!
s [ j ])&&( d [ j ]< temp ))
                        {

                                u
= j ;
                                temp
= d [ j ];
                        }

                        s
[ u ]= 1 ;
                        for
(
j = 1 ; j <= n ; j ++)
                                if
((!
s [ j ])&&( edges [ u ][ j ]< MAX )&&( d [ u ]+ edges [ u ][ j ])< d [ j ])
                                        d
[ j ]= d [ u ]+ edges [ u ][ j ];
        }
   
}

 
int
main
()
{

    int
i , j , a , b , c ;
    while
(
scanf ( "%d%d" ,& n ,& m )!= EOF &&( n || m ))
    {

        for
(
i = 0 ; i <= n ; i ++){
            for
(
j = 0 ; j <= n ; j ++)
            {

                edges
[ i ][ j ]= MAX ;
                edges
[ j ][ i ]= MAX ;
            }
        }

        for
(
i = 0 ; i < m ; i ++)
        {

            scanf
( "%d %d %d" ,& a ,& b ,& c );
            if
(
edges [ a ][ b ]> c ){
                edges
[ a ][ b ]= c ;
                edges
[ b ][ a ]= c ;
            }
        }

        dijkstra
( 1 );
        printf
( "%d\n" , d [ n ]);
    }

    return
0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值