公交线路
比赛首页 > A 公交线路 > 50202078
P市有n个公交站,之间连接着m条道路。P市计划新开设一条公交线路,该线路从城市的东站(s点)修建到西站(t点),请为P市设计一条满足上述条件并且最短的公交线路图。
Dijkstra求最短路
建立一个集合s,集合s是当前已经确定的、最短路的点
1.先初始化所有的点,起点为0,然后其它点都初始化为正无穷(第一步只有起点被遍历到)
2.接下来是一个循环的过程,循环n次,找到不在集合s中,距离最近的点(为t),把t加到s中去
3.用t更新所有点的距离——看dis[x]是否大于dis[t]+w(加上一个权重)
*每一个循环,都可以确定一个最短点的距离,循环n次就可以确定n个点的距离
*这样我们就可以求出每一个点到起点的最短距离了
*基于贪心
*时间复杂度O(n^3)
#include#include<string.h> using namespace std; const int inf = 0x3f3f3f3f; int f[1020][1020]; int main() { int n, m, s, t; int x,y,z; cin >> n >> m >> s >> t; memset(f,inf,sizeof(f)); for (int i = 0; i < m; i++) { cin >> x >> y >> z; f[x][y] = min(f[x][y], z); f[y][x] = min(f[y][x], z); } for (int i = 1; i <= n; i++) { f[i][i] = 0; } for (int p = 1; p <= n; p++) for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) f[i][j] = min(f[i][j], f[i][p] + f[p][j]); if (f[s][t] >= inf) cout << -1 << endl; else cout << f[s][t] << endl; return 0; }