HDU_2066 一个人的旅行(Dijkstra)
2011-09-07 11:10
309 查看
开始用Floyd做的,TLE!更二的时我自己找了一组1 1000 的数据,4S才算出来,本身程序就有问题,我居然还交上去了。。。后来用Dijkstra做,过了。。。200+ms;
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N = 1005; const int inf = 1000000; int dis ; int low ; int vis ; int num1 ; int num2 ; void Dijkstra(int n, int v) { int flag, min, i, j; for(i = 1; i <= n; i++) { low[i] = dis[v][i]; vis[i] = 0; } vis[v] = 1; for(i = 2; i <= n; i++) { min = inf; flag = v; for(j = 2; j <= n; j++) { if(min > low[j] && !vis[j]) { min = low[j]; flag = j; } } vis[flag] = 1; for(j = 2; j <= n; j++) if(!vis[j] && dis[flag][j] < inf) { int tmp = low[flag] + dis[flag][j]; if(tmp < low[j]) low[j] = tmp; } } } int main() { //freopen("data.in", "r", stdin); int t, s, d; while(~scanf("%d%d%d", &t, &s, &d)) { int a, b, c, i, j, max = -inf; for(i = 1; i <= N; i++) for(j = 1; j <= N; j++) { if(i == j) dis[i][j] = 0; else dis[i][j] = inf; } for(i = 1; i <= t; i++) { scanf("%d%d%d", &a, &b, &c); if(c < dis[a][b]) dis[a][b] = dis[b][a] = c; if(max < a) max = a; if(max < b) max = b; } for(i = 1; i <= s; i++) scanf("%d", &num1[i]); for(i = 1; i <= d; i++) scanf("%d", &num2[i]); int min = inf; for(i = 1; i <= s; i++) { Dijkstra(max, num1[i]); for(j = 1; j <= d; j++) { if(min > low[num2[j]]) min = low[num2[j]]; } } printf("%d\n", min); } }
相关文章推荐
- HDU 2066 一个人的旅行【dijkstra】
- hdu 2066 一个人的旅行(Dijkstra求最短路问题)
- HDU 2066 【Dijkstra】 一个人的旅行
- HDU 2066 一个人的旅行() (Dijkstra)
- HDU 2066:一个人的旅行【Dijkstra & SPFA & Floyd】
- hdu-2066-一个人的旅行(dijkstra)
- hdu 2066 一个人的旅行(单源最短路dijkstra)and hdu 2544
- HDU 2066 一个人的旅行(Dijkstra,建图很巧妙)
- hdu 2066 一个人的旅行(dijkstra特殊)
- hdu 2066 一个人的旅行 dijkstra
- HDU 2066-一个人的旅行(最短路Dijkstra)
- hdu 2066 一个人的旅行 dijkstra入门题
- HDU 2066 一个人的旅行 dijkstra&&spfa
- hdu 2066 一个人的旅行 最短路 dijkstra 解题报告
- HDU - 2066 一个人的旅行 (Dijkstra)
- HDU 2066--一个人的旅行【Dijkstra】
- HDU2066 一个人的旅行【Dijkstra】
- HDU-2066-一个人的旅行(最短路,dijkstra)
- hdu 2066 一个人的旅行(Dijkstra)
- hdu 2066 一个人的旅行(Dijkstra)