这里的N比较小,所以不用优先队列,用for循环搜索最近的点也能通过,书上的答案是用结构体和优先队列。
#include <iostream> using namespace std; const int N = 200; const int INF = 1000000; int n, m, s, t; int map[N][N]; int dis[N]; bool vis[N]; void init(){ for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ map[i][j] = INF; } dis[i] = INF; vis[i] = false; } } void Dijkstra(int s){ int i, j; for(i = 0; i < n; i++){ dis[i] = map[s][i]; } dis[s] = 0; vis[s] = true; int mincost, minnode; for(i = 0; i < n; i++){ mincost = INF; minnode = 0; //这句有没有都行 //找到距离s最近的点 for(j = 0; j < n; j++){ if(!vis[j] && mincost > dis[j]){ minnode = j; mincost = dis[j]; } } if(mincost == INF) break; vis[minnode] = true; //更新,如果经过minnode会缩短cost则更新。 for(j = 0; j < n; j++){ if(!vis[j] && dis[j] > dis[minnode] + map[minnode][j]){ dis[j] = dis[minnode] + map[minnode][j]; } } } } int main(){ int from, to, cost; while(cin >> n >> m){ init(); for(int i = 0; i < m; i++){ cin >> from >> to >> cost; if(map[from][to]> cost){ map[from][to] = cost; map[to][from] = cost; } } cin >> s >> t; Dijkstra(s); if(dis[t] == INF){ printf("-1\n"); }else{ printf("%d\n", dis[t]); } } return 0; }
第一次提交WA是因为,没有注意到可能多次输入同一条路径,这时要判断一下。
下面是没有判断,所以WA的代码
#include <iostream> using namespace std; const int N = 200; const int INF = 1000000; int n, m, s, t; int map[N][N]; int dis[N]; bool vis[N]; void init(){ for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ map[i][j] = INF; } dis[i] = INF; vis[i] = false; } } void Dijkstra(int s){ int i, j; for(i = 0; i < n; i++){ dis[i] = map[s][i]; } dis[s] = 0; vis[s] = true; int mincost, minnode; for(i = 0; i < n; i++){ mincost = INF; //找到距离s最近的点 for(j = 0; j < n; j++){ if(!vis[j] && mincost > dis[j]){ minnode = j; mincost = dis[j]; } } if(mincost == INF) break; vis[minnode] = true; //更新,如果经过minnode会缩短cost则更新。 for(j = 0; j < n; j++){ if(!vis[j] && dis[j] > dis[minnode] + map[minnode][j]){ dis[j] = dis[minnode] + map[minnode][j]; } } } } int main(){ int from, to, cost; while(cin >> n >> m){ init(); for(int i = 0; i < m; i++){ cin >> from >> to >> cost; //if(map[from][to]> cost){ map[from][to] = cost; map[to][from] = cost; //} } cin >> s >> t; Dijkstra(s); if(dis[t] == INF){ printf("-1\n"); }else{ printf("%d\n", dis[t]); } } return 0; }