ural Russian Pipelines(最短路)

题意:给出N个点和M条有向边,求给出的s点到t点的最短路。

思路:spfa,只是这题给出的是有向边,在存储的时候只存一条边就可以了,其他的和无向边一样。

代码:

View Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
#include <vector>
#include <map>
#define  N 505
using namespace std ;

int mp[N][N] , dis[N] , n ;
bool vist[N] ;
queue<int>q ;

void bfs( int s , int t )
{
    int x ;
    while( !q.empty()) q.pop() ;
    q.push( s ) ;
    vist[s] = true ;

    while( !q.empty())
    {
        x = q.front() ;
        q.pop() ;
        vist[x] = false ;

        for ( int i = 1 ; i <= n ; i++ )
        {
            if ( mp[x][i] && dis[i] < dis[x] + mp[x][i] )
            {
                dis[i] = dis[x] + mp[x][i] ;
                if( !vist[i] )
                {
                    vist[i] = true ;
                    q.push( i ) ;
                }
            }
        }
    }
    if ( dis[t] == 0 )
    {
        printf ( "No solution\n" ) ;
    }
    else
    {
        printf ( "%d\n" , dis[t] ) ;
    }
}

int main()
{
    int  m , x , y , z , s , t ;

    while( scanf ( "%d%d" , &n , &m ) != EOF )
    {
        memset( mp ,  0 , sizeof( mp )) ;
        for ( int i = 0 ; i < m ; i++ )
        {
            scanf ( "%d%d%d" , &x , &y , &z ) ;
            mp[x][y] = z ;
        }
        scanf ( "%d%d" , &s , &t ) ;
        if ( s == t )
        {
            printf ( "0\n" ) ;
        }
        else
        {
            memset( dis , 0 , sizeof ( dis )) ;
            memset( vist , false , sizeof ( vist )) ;

            bfs( s , t ) ;
        }
    }
    return 0 ;
}

 

posted @ 2013-03-09 10:00  Misty_1  阅读(144)  评论(0编辑  收藏  举报