您的位置:首页 > 其它

ural Russian Pipelines(最短路)

2013-03-09 10:00 375 查看
题意:给出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

, dis
, n ;
bool vist
;
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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: