HDU - 2680 - Choose the best route (经典最短路问题dijkstra算法!!)
Choose the best route
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7671 Accepted Submission(s): 2524
Each case begins with three integers n, m and s,(n<1000,m<20000,1=<s<=n) n stands for the number of bus stations in this city and m stands for the number of directed ways between bus stations .(Maybe there are several ways between two bus stations .) s stands for the bus station that near Kiki’s friend’s home.
Then follow m lines ,each line contains three integers p , q , t (0<t<=1000). means from station p to station q there is a way and it will costs t minutes .
Then a line with an integer w(0<w<n), means the number of stations Kiki can take at the beginning. Then follows w integers stands for these stations.
5 8 5 1 2 2 1 5 3 1 3 4 2 4 7 2 5 6 2 3 5 3 5 1 4 5 1 2 2 3 4 3 4 1 2 3 1 3 4 2 3 2 1 1
1 -1
AC代码:
#include <cstdio> #include <cstring> #include <algorithm> #define INF 0x7f7f7f7f using namespace std; const int MAX = 1005; int n, m, s; int map[MAX][MAX], dis[MAX], vis[MAX]; void dijk(int s) { for(int i=1; i<=n; i++) dis[i] = map[s][i]; vis[s] = 1; dis[s] = 0; for(int i=1; i<n; i++) { int min = INF, pos; for(int j = 1; j <= n; j++) if(!vis[j] && dis[j] < min) min = dis[pos = j]; if(min == INF) break; vis[pos] = 1; for(int j=1; j<=n; j++) if(!vis[j] && dis[pos] + map[pos][j] < dis[j]) dis[j] = dis[pos] + map[pos][j]; } } int main() { while(scanf("%d %d %d", &n, &m, &s) != EOF) { memset(vis, 0, sizeof(vis)); memset(map, 0x7f, sizeof(map)); while(m--) { int x, y, w; scanf("%d %d %d", &x, &y, &w); if(w < map[y][x]) map[y][x] = w; //注意是有向的,反方向 } dijk(s); int a, b, ans = INF; scanf("%d", &b); for(int i=1; i<=b; i++) { scanf("%d", &a); ans = min(ans, dis[a]); } if(ans != INF)printf("%d\n", ans); else printf("-1\n"); } return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。