• uestc 方老师分身 I


    题意有点晕啊。。 水题一道。。

    分身去教室的时候是单向的,回来的时候也是单向的,这时候就要反过来跑一遍最短路了。。

    Dijkstra看着模板写的。。sigh~ 要不是渣渣。。还是记不住。。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<string>
     6 #include<queue>
     7 #include<algorithm>
     8 #include<map>
     9 #include<iomanip>
    10 #include<climits>
    11 #include<string.h>
    12 #include<cmath>
    13 #include<stdlib.h>
    14 #include<vector>
    15 #define INF 1e7
    16 #define MAXN 100010
    17 #define maxn 1000010
    18 #define Mod 1000007
    19 #define N 1010
    20 using namespace std;
    21 typedef long long LL;
    22 
    23 int n, m, x;
    24 int G[N][N];
    25 int d[N], d1[N], d2[N];
    26 bool vis[N];
    27 
    28 bool Dijkstra(int x, int* d)
    29 {
    30     int i, j, pos, min;
    31     for (i = 1; i <= n; ++i)
    32         d[i] = G[x][i];
    33     d[x] = 0;
    34     vis[x] = true;
    35     for (i = 1; i <= n; ++i) {
    36         min = INF;
    37         for (j = 1; j <= n; ++j) {
    38             if (d[j] < min && !vis[j]) {
    39                 pos = j;
    40                 min = d[j];
    41             }
    42         }
    43         if (min == INF) return false;
    44         vis[pos] = true;
    45         for (j = 1; j <= n; ++j)
    46             if (d[pos] + G[pos][j] < d[j] && !vis[j])
    47                 d[j] = d[pos] + G[pos][j];
    48     }
    49     return true;
    50 }
    51 
    52 void process()
    53 {
    54     int u, v, t;
    55     for (int i = 0; i <= n; ++i)
    56         for (int j = 0; j <= n; ++j)
    57             G[i][j] = INF;
    58     for (int i = 0; i < m; ++i) {
    59         cin >> u >> v >> t;
    60         G[u][v] = t;
    61     }
    62     memset(vis, 0, sizeof(vis));
    63     Dijkstra(x, d1);
    64     for (int i = 0; i <= n; ++i)
    65         for (int j = i + 1; j <= n; ++j)
    66             swap(G[i][j], G[j][i]);
    67     memset(vis, 0, sizeof(vis));
    68     Dijkstra(x, d2);
    69     for (int i = 0; i <= n; ++i)
    70         d[i] = d1[i] + d2[i];
    71     /*for (int i = 1; i <= n; ++i)
    72         cout << d[i] << " ";
    73     cout << endl;*/
    74     int ans = 0;
    75     for (int i = 1; i <= n; ++i)
    76             ans = max(ans, d[i]);
    77     cout << ans << endl;
    78 }
    79 
    80 int main()
    81 {
    82     while (cin >> n >> m >> x)
    83         process();
    84     return 0;
    85 }
  • 相关阅读:
    tyvj1463 智商问题
    P1070 道路游戏
    P1862 输油管道问题
    P1875 佳佳的魔法药水
    P1498 南蛮图腾
    P1489 猫狗大战
    P1395 会议(求树的重心)
    P2285 [HNOI2004]打鼹鼠
    P3819 松江1843路(洛谷月赛)
    P3818 小A和uim之大逃离 II(洛谷月赛)
  • 原文地址:https://www.cnblogs.com/usedrosee/p/4291014.html
Copyright © 2020-2023  润新知