最短路问题 Dijkstra
分析:
1)本题的起始点和终点不唯一。假设有一点起始点离全部的相邻城市的距离都是1,有一点终点离全部的想要去的目的地的距离也都是1,则将Dijkstra出来的值减2即可。
2)两个城市之间的路不唯一,可有多条路,所以在输入的时候做一下判断,选取最小的。
AC代码:
#include <cstdio> #include <cstring> using namespace std; #define MAXN 1010 #define INF 0x3fffffff int s[MAXN],dist[MAXN],map[MAXN][MAXN]; int T,S,D; int max(int x, int y) { if(x < y) return y; else return x; } int Dijkstra(int n) { int i,j; memset(s, 0, sizeof(s)); for(i=0; i<=n; i++) dist[i] = map[0][i]; s[0] = 1; dist[0] = 0; for(i=0; i<n; i++) { int min = INF; int u; for(j=0; j<=n; j++) { if(!s[j] && dist[j]<min) { min = dist[j]; u = j; } } s[u] = 1; for(j=0; j<=n; j++) { if(!s[j] && dist[j]>map[u][j]+dist[u]) dist[j] = map[u][j] + dist[u]; } } return dist[n]; } int main() { int i,j; while(scanf("%d%d%d",&T,&S,&D)!=EOF) { int ss[MAXN],ee[MAXN]; int a,b,_time; int end = 0; for(i=0; i<MAXN; i++) for(j=0; j<MAXN; j++) { map[i][j] = map[j][i] = INF; } for(i=0; i<T; i++) { scanf("%d%d%d",&a,&b,&_time); if(map[a][b] == INF) { map[a][b] = map[b][a] = _time; } else if(_time < map[a][b]) { map[a][b] = map[b][a] = _time; } if(end < max(a, b)) { end = max(a, b); } } for(i=0; i<S; i++) { scanf("%d",&ss[i]); map[0][ss[i]] = map[ss[i]][0] = 1; } end++; for(i=0; i<D; i++) { scanf("%d",&ee[i]); map[end][ee[i]] = map[ee[i]][end] = 1; } int ans = Dijkstra(end)-2; printf("%d\n", ans); } return 0; }