题意:给出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 ; }