zoukankan      html  css  js  c++  java
  • 给定一个无向图,求删掉一条边之后的最短路,但是删的是哪条边你不知道,问最坏情况下最短路是多长()

    题目来源:晴天的魔法乐园

    分析:

    综合上述讨论,本题的做法就是,先求一次最短路,用pre数组记录【其中一条】最短路径,然后遍历这条最短路径上的边,删除后各求一次路径,取他们中从起点到终点的最短距离的最大值即可

     

      1 //// patest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
      2 ////
      3 #include "pch.h"
      4 
      5 #include <cstdio>
      6 #include <cmath>
      7 #include <cstdlib>
      8 #include <cstring>
      9 #include <iostream>
     10 #include <iterator>
     11 #include <algorithm>
     12 #include <string>
     13 #include <set>
     14 #include <unordered_set>
     15 #include <map>
     16 #include <unordered_map>
     17 #include <vector>
     18 #include <stack>
     19 #include <queue>
     20 #include <deque>
     21 
     22 using namespace std;
     23 const int INF = 0x7fffffff;
     24 const int maxn = 1010;
     25 const int maxk = 10010;
     26 
     27 //void printVector(vector<int>& vt) {
     28 //    int size = vt.size();
     29 //    for (int i = 0; i < size; i++) {
     30 //        printf("%d", vt[i]);
     31 //        if (i != size - 1) printf(" ");
     32 //    }
     33 //    printf("
    ");
     34 //
     35 //}
     36 
     37 
     38 int n, m, st, ed;
     39 bool vis[maxn];
     40 int d[maxn];
     41 int G[maxn][maxn];
     42 
     43 vector<int> pre[maxn];
     44 
     45 void Dijkstra(int s) {
     46 
     47     memset(vis, false, sizeof(vis));
     48     fill(d, d + maxn, INF);
     49     d[s] = 0;
     50     for (int i = 0; i < n; i++) {
     51         int u = -1, MIN = INF;
     52         for (int j = 1; j <= n; j++) {
     53             if (vis[j] == false && d[j] < MIN) {
     54                 MIN = d[j];
     55                 u = j;
     56             }
     57         }
     58 
     59         if (u == -1) return;
     60         vis[u] = true;
     61         for (int v = 1; v <= n; v++) {
     62             if (vis[v] == false && G[u][v] != INF) {
     63                 if (d[u] + G[u][v] < d[v]) {
     64                     d[v] = d[u] + G[u][v];
     65                     pre[v].clear();
     66                     pre[v].push_back(u);
     67                 }
     68                 else if (d[u] + G[u][v] == d[v]) {
     69                     pre[v].push_back(u);
     70                 }
     71             }
     72         }
     73         
     74     }
     75 }
     76 
     77 vector<pair<int, int>> ans;
     78 
     79 void DFS(int index) {
     80     for (auto next : pre[index]) {
     81         ans.push_back(make_pair(index, next));
     82         DFS(next);
     83     }
     84 }
     85 
     86 int maxTime = -1;
     87 int main() {
     88 
     89     fill(G[0], G[0] + maxn * maxn, INF);
     90 
     91     scanf("%d%d", &n, &m);
     92     st = 1, ed = n;
     93     for (int i = 0; i < m; i++) {
     94         int u, v, time;
     95         scanf("%d%d%d", &u, &v, &time);
     96         G[u][v] = G[v][u] = time;
     97     
     98     }
     99 
    100     Dijkstra(st);
    101     DFS(ed);
    102 
    103     int lastTime;
    104     for (int i = 0; i < ans.size(); i++) {
    105         int u = ans[i].first;
    106         int v = ans[i].second;
    107         if (i > 0) {
    108             int id1 = ans[i - 1].first;
    109             int id2 = ans[i - 1].second;
    110             G[id1][id2] = G[id2][id1] = lastTime;
    111         }
    112 
    113         lastTime = G[u][v];
    114         G[u][v] = G[v][u] = INF;
    115 
    116         Dijkstra(st);
    117         maxTime = max(maxTime, d[ed]);
    118 
    119     }
    120 
    121     if (maxTime == INF) printf("It's a bug!!!
    ");
    122     else printf("%d
    ", maxTime);
    123     
    124     
    125     
    126 
    127     return 0;
    128 }
  • 相关阅读:
    find命令
    shell编程基础
    grep命令
    awk命令
    结对项目之需求分析与原型模型设计
    使用Git进行代码管理的心得
    软件工程的实践项目的自我目标
    第五次作业——团队项目——需求规格说明书
    调研android开发环境的发展演变
    结对编程总结
  • 原文地址:https://www.cnblogs.com/fuqia/p/10505381.html
Copyright © 2011-2022 走看看