http://acm.hdu.edu.cn/showproblem.php?pid=1142
Dijkstra + Dfs搜索进行优化;
题意为:
找出比1->2要小的路径个数
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
const int maxn = 1005 ;
const int INF = 1000000000 ;
int edge[ maxn ][ maxn ] ;
int dist[ maxn ] ;
int path[ maxn ] ;
int S[ maxn ] ;
int n , m ;
using namespace std;
int Dijkstra( int v0 )
{
int i , j , k ;
memset( S , 0 , sizeof( S ) ) ;
for( i = 1 ; i <= n ; i++ )
{
dist[ i ] = INF ;
}
// S[ v0 ] = 1 ;
dist[ v0 ] = 0 ;
for( i = 1 ; i < n ; i++ )
{
int MIN = INF , u = v0 ;
for( j = 1 ; j <= n ; j++ )
{
if( !S[ j ] && dist[ j ] < MIN )
{
u = j ;
MIN = dist[ j ] ;
}
}
S[ u ] = 1 ;
for( k = 1 ; k <= n ; k++ )
{
if( !S[ k ] && edge[ u ][ k ] && dist[ u ] + edge[ u ][ k ] < dist[ k ] )
{
dist[ k ] = dist[ u ] + edge[ u ][ k ] ;
}
}
}
}
int sum ;
int visit[ maxn ] ;
int mark[ maxn ] ;
int Dfs( int x )
{
if( mark[ x ] )
return mark[ x ] ;
if( x == 2 )
return 1 ;
for( int i = 1 ; i <= n ; i++ )
{
if( visit[ i ] == 0 && edge[ x ][ i ] && dist[ i ] < dist[ x ] )
mark[ x ] += Dfs( i ) ;
}
return mark[ x ] ;
}
int main()
{
int i , j , k ;
int x , y ,temp ;
while( scanf( "%d" , &n ) != EOF && n)
{
memset( visit , 0 , sizeof( visit ) ) ;
memset( mark , 0 , sizeof( mark ) ) ;
memset( edge , 0 , sizeof( edge )) ;
scanf( "%d" , &m ) ;
for( i = 1 ; i <= m ; i++ )
{
scanf( "%d%d%d" , &x , &y , &temp ) ;
edge[ x ][ y ] = edge[ y ][ x ] = temp ;
}
Dijkstra( 2 ) ;
printf( "%d\n" , Dfs( 1 ) ) ;
}
return 0 ;
}