题目的意思是求解从路标N到路标1的最短路径,简单的最短路径题目,Dijkstra或者Bellman_Ford算法都可以过。
题目有一个坑:输入有重边,所以要选择最小的长度。
下面是AC的代码:
#include <iostream> #include <cstdio> using namespace std; int cost[1005][1005]; bool vis[1005]; int dis[1005]; const int INF = 100000000; int N, T; int min(int x, int y) { return x > y ? y : x; } void Dijkstra() //求最短路径 { int i; for(i = 1; i <= N; i++) { vis[i] = false; dis[i] = INF; } dis[N] = 0; while(true) { int v = -1; for(i = 1; i <= N; i++) //从没有选取的顶点中选一个距离最小的顶点 { if(!vis[i] && (v == -1 || dis[i] < dis[v])) v = i; } if(v == -1) //全部选取完,退出 break; vis[v] = true; for(i = 1; i <= N; i++) //更新dis { dis[i] = min(dis[i], dis[v] + cost[v][i]); } } } int main() { int a, b, c; while(scanf("%d%d", &T, &N) != EOF) { for(int j = 0; j <= N; j++) //初始化cost数组 { for(int k = 0; k <= N; k++) { if(j != k) cost[j][k] = INF; else cost[j][k] = 0; } } for(int i = 0; i < T; i++) { scanf("%d%d%d", &a, &b, &c); if(cost[a][b] > c) //取最小长度 cost[a][b] = cost[b][a] = c; } Dijkstra(); printf("%d\n", dis[1]); } return 0; }
时间: 2024-10-08 10:53:19