http://acm.hdu.edu.cn/showproblem.php?pid=2066
读懂题意就不是难题
题意:
给你 m , n , t ; M代表给你的组数,然后输入X, Y TEMP,分别代表从X到Y所需要花费的时间TEMP,本题没有给出构图中的矩阵大小,所以需要自己找到最大的边数;
n代表相邻的城镇,可以理解为n个起点;t 代表有几个喜欢的地方,可以理解为终点;这里的意思就是给定不同的起点,和不同的终点,然后让你选定一个起点和终点使得路径最短(时间最少)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<iostream>
using namespace std ;
const int maxn = 1005 ;
const int INF = 1000000000 ;
int edge[ maxn ][ maxn ] ;
int dist[ maxn ] ;
int used[ maxn ] ;
int n , m , t;
int maxm ;
int num1[ maxn ] , num2[ maxn ] ;
int path[ maxn ] ;
int Dijkstra( int v0 )
{
int i , j , k ;
memset( used , 0 , sizeof( used ) ) ;
for( i = 1 ; i <= maxm ; i++)
{
dist[ i ] = INF ;
}
dist[ v0 ] = 0 ;
for( i = 1 ; i < maxm ; i++ )
{
int MIN = INF , u = v0 ;
for( j = 1 ; j <= maxm ; j++ )
{
if( !used[ j ] && dist[ j ] < MIN )
{
MIN = dist[ j ] ;
u = j ;
}
}
used[ u ] = 1 ;
for( k = 1 ; k <= maxm ; k++ )
{
if( !used[ k ] && edge[ u ][ k ] && edge[ u ][ k ] + dist[ u ] < dist[ k ] )
{
dist[ k ] = dist[ u ] + edge[ u ][ k ] ;
}
}
}
}
int main()
{
int i , j , k ;
int x , y , temp ;
int num ;
while( scanf( "%d%d%d" ,&m , &n , &t ) != EOF )
{
if( m == 0 && n ==0 && t== 0 )
break ;
maxm = 0 ;
memset( edge , 0 , sizeof( edge ) ) ;
for( i = 1 ; i <= m ; i++ )
{
scanf( "%d%d%d" , &x, &y , &temp ) ;
if( x > maxm )
maxm = x ;
if( y > maxm )
maxm = y ;
if( edge[ x ][ y ] == 0 )
edge[ x ][ y ] = edge[ y ][ x ] = temp ;
else
if( temp < edge[ x ][ y ] )
edge[ x ][ y ] = edge[ y ][ x ] = temp ;
// cout<< maxm ;
}
/* for( i = 1 ; i <= maxm ; i++ )
{
for( j = 1 ; j <= maxm ; j++)
printf( "%d " , edge[ i ][ j ] ) ;
cout<< endl;
}*/
for( i = 1 ; i <= n ; i++ )
{
scanf( "%d" , &num1[ i ] ) ;
// cout << num1[ i ] << endl ;
}
for( i = 1 ; i <= t ; i++ )
{
scanf( "%d" , &num2[ i ] ) ;
// cout<< num2[ i ] << endl ;
}
int MAX = INF ;
for( i = 1 ; i <= n ; i++ )
{
Dijkstra( num1[ i ] ) ;
for( j = 1 ; j <= t ; j ++ )
{
// cout << dist[ num2[ j ] ] << endl ;
if( dist[ num2[ j ] ] < MAX )
MAX = dist[ num2[ j ] ] ;
}
}
printf( "%d\n" , MAX ) ;
}
return 0 ;
}