poj1797 最短路变形

来源:互联网 发布:淘宝店商品怎么分类 编辑:程序博客网 时间:2024/05/16 19:53

题目大意:求第1个点到第n个点的路径中所有的边所能承受最小重力的最大值

思路: 刚开始一想没有思路然后想到用Floyd不断更新到每个点的最大值得最小值,TLE一发后想到这样做可能是错的,不仅仅是时间复杂度太高,更新过程中还要记录所有边的最小值,所以就想到了Dijkstra算法,不断更新距离已知集合的最大值不断把最大值得点加进去,中间记录答案

网上见有的人说最大生成树,确实有道理,prim算法和dijkstra算法只是更新的时候不一样而已


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1000+5;int f[maxn][maxn];int dis[maxn], vis[maxn];int n, m;void dijkstra(){for (int i = 1; i <= n; i++) dis[i] = f[1][i];memset(vis, 0, sizeof(vis));vis[1] = 1;dis[1] = 0;int ans = 0x7f7f7f7f;for (int i = 1; i <= n; i++){int mmax = 0, x = 0;for (int j = 1; j <= n; j++){if (!vis[j] && mmax < dis[j]) {mmax = dis[j];x = j;}}if(ans > mmax) ans = mmax;if (x == n) break;vis[x] = 1;for (int j = 1; j <= n; j++){if(!vis[j] && dis[j] < f[x][j])dis[j] = f[x][j];}}cout << ans << endl;}int main(){//freopen("in", "r", stdin);int t;int kcase = 0;cin >> t;while (t--){memset(f, 0, sizeof(f));cin >> n >> m;for (int i = 0; i < m; i++){int x, y, z;scanf("%d%d%d", &x, &y, &z);f[x][y] = f[y][x] = z;}printf("Scenario #%d:\n", ++kcase);dijkstra();cout << endl;}return 0;}


0 0
原创粉丝点击