杭电 2066 一个人的旅行
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=2066
此题原来提交了一份floyd_warshall算法的代码,然后结果是超时,所以写了一个dijkstra算法的,AC!
#include <stdio.h> //样例可能的最大的边数 #define MAXN 2000 //初始化用到的最大值 #define INF 100000 //存储城市与城市之间耗费时间的最小权值 int mat[MAXN][MAXN]; int min[MAXN]; void dijkstra(int n, int s) { int v[MAXN], i, j, k; for( i = 1; i <= n; i++ ) v[i] = 0, min[i] = INF; for( min[s] = 0, j = 0; j <= n; j++ ) { for( k = 0, i = 1; i <= n; i++ ) if( (!v[i]) &&((k == 0)||(min[i] < min[k])) ) k = i; for( v[k] = 1, i = 1; i <= n; i++ ) if( (!v[i]) && (min[k] + mat[k][i] < min[i]) ) min[i] = min[k] + mat[k][i]; } } int main() { //t表示所有的边数; //s表示可能的所有的起点数; //d表示可能的所有的终点数。 int t, s, d, i, j, k, temp; int max, min0; int ss[MAXN],dd[MAXN]; //printf("123\n"); while( scanf( "%d%d%d", &t, &s, &d) != EOF ) { //初始化 max = 0; //printf("123\n"); for( i = 1; i < MAXN; i++ ) for( j = 1; j < MAXN; j++ ) mat[i][j] = INF; //printf("123\n"); //读取数据 for( k = 0; k < t; k++ ) { scanf( "%d%d%d", &i, &j, &temp ); //解决重边问题 if( temp < mat[i][j] ) mat[i][j] = mat[j][i] = temp; //printf("123\n"); //找出可访问到的最大顶点数 i = (i > j) ? i : j; max = (max > i) ? max : i; } /*printf("123\n"); printf( "%d\n",max); printf( "%d %d\n", s, d );*/ for( i = 0; i < s; i++ ) { scanf( "%d", &ss[i] ); max = (max > ss[i]) ? max : ss[i]; } for( i = 0; i < d; i++ ) { scanf( "%d",&dd[i] ); max = (max > dd[i]) ? max : dd[i]; } /*for( i = 1; i <= max; i++ ) { for( j = 1; j <= max; j++ ) printf( "%d ", mat[i][j] ); printf( "\n" ); }*/ //处理 min0 = INF; for(i = 0; i < s; i++) { dijkstra(max,ss[i]); for( j = 0; j < d; j++ ) if( min0 > min[dd[j]] ) min0 = min[dd[j]]; } printf( "%d\n", min0 ); } return 0; }