HDU 2066 一个人的旅行
2012-05-21 21:48
260 查看
/* 这道题原来WA,错误找了蛮久的,问题出在①处,因为两个城市之间可能存在两条道路。 解题思路:增加一个超级源点,从它到邻近城市的距离为0. */ #include <cstdio> #include <cstring> const int nMax = 1007; const int INF = 1<<30; int G[nMax][nMax]; int T, S, D, N; int s[nMax], d[nMax]; int dis[nMax]; int ans; void init() { int i; N = 0; memset(G, -1 , sizeof(G)); for(i = 0; i < T; ++ i) { int a, b, w; scanf("%d%d%d", &a, &b, &w); if(a > N) N = a; if(b > N) N = b; if(G[a][b] < 0 || G[a][b] > w)//①这里WA G[a][b] = G[b][a] = w; } for(i = 0; i < S; ++ i) { scanf("%d", &s[i]); G[s[i]][0] = G[0][s[i]] = 0; } for(i = 0; i < D; ++ i) scanf("%d", &d[i]); ans = INF; } void dijkstra() { int i; for(i = 0; i < nMax; ++ i) dis[i] = INF; dis[0] = 0; bool visit[nMax]; memset(visit, 0, sizeof(visit)); for(i = 1; i <= N; ++ i) { int j, m, x; m = INF; for(j = 0; j <= N; ++ j) if(!visit[j] && dis[j] < m) m = dis[x = j]; visit[x] = 1; for(j = 0; j <= N; ++ j) if(!visit[j] && G[x][j] >= 0 && dis[x] + G[x][j] < dis[j]) dis[j] = dis[x] + G[x][j]; } for(i = 0; i < D; ++ i) if(dis[d[i]] < ans) ans = dis[d[i]]; } int main() { //freopen("f://data.in", "r", stdin); while(scanf("%d %d %d", &T, &S, &D) != EOF) { init(); dijkstra(); printf("%d\n", ans); } return 0; }
相关文章推荐
- HDU 2066 一个人的旅行
- (*)hdu 2066 一个人的旅行(Dijkstra)
- hdu-2066 一个人的旅行(最短路spfa)
- hdu 2066 一个人的旅行 最短路
- hdu 2066 一个人的旅行(dijkstra)
- HDU 2066 一个人的旅行(最短路的简单题)
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行 最短路问题
- HDU-2066-一个人的旅行
- HDU 2066 一个人的旅行.
- HDU 2066 一个人的旅行
- hdu 2066 一个人的旅行 (dij+heap)
- hdu 2066 一个人的旅行 dijkstra
- HDU 2066 一个人的旅行【最短路,多起点多终点,Dijkstra算法+spfa算法】
- hdu-2066 一个人的旅行
- hdu 2066 一个人的旅行(最短路径 Dijkstra算法)
- HDU 2066 一个人的旅行(Dijkstra+Floyd)
- hdu 2066:一个人的旅行
- (阶段三 dijkstra算法温习1.2)HDU 2066 一个人的旅行(使用dijkstra来解决多源起点和多源终点的最短路径问题)
- HDU 2066 一个人的旅行