zoukankan      html  css  js  c++  java
  • Codeforces 773D Perishable Roads 最短路 (看题解)

    Perishable Roads

    智商题, 不会啊。。 

    贴个官方题解

    https://codeforces.com/blog/entry/51883

    #include<bits/stdc++.h>
    #define LL long long
    #define LD long double
    #define ull unsigned long long
    #define fi first
    #define se second
    #define mk make_pair
    #define PLL pair<LL, LL>
    #define PLI pair<LL, int>
    #define PII pair<int, int>
    #define SZ(x) ((int)x.size())
    #define ALL(x) (x).begin(), (x).end()
    #define fio ios::sync_with_stdio(false); cin.tie(0);
    
    using namespace std;
    
    const int N = 2000 + 7;
    const int inf = 0x3f3f3f3f;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const int mod = 1e9 + 7;
    const double eps = 1e-8;
    const double PI = acos(-1);
    
    template<class T, class S> inline void add(T &a, S b) {a += b; if(a >= mod) a -= mod;}
    template<class T, class S> inline void sub(T &a, S b) {a -= b; if(a < 0) a += mod;}
    template<class T, class S> inline bool chkmax(T &a, S b) {return a < b ? a = b, true : false;}
    template<class T, class S> inline bool chkmin(T &a, S b) {return a > b ? a = b, true : false;}
    
    int n, mine = inf, G[N][N], d[N];
    bool vis[N];
    
    int main() {
        scanf("%d", &n);
        for(int i = 1; i <= n; i++) {
            for(int j = i + 1; j <= n; j++) {
                scanf("%d", &G[i][j]);
                G[j][i] = G[i][j];
                chkmin(mine, G[i][j]);
            }
        }
        for(int i = 1; i <= n; i++) {
            for(int j = i + 1; j <= n; j++) {
                G[i][j] -= mine;
                G[j][i] -= mine;
            }
        }
        for(int i = 1; i <= n; i++) {
            d[i] = inf;
            for(int j = 1; j <= n; j++) {
                if(i != j) {
                    chkmin(d[i], G[i][j] << 1);
                }
            }
        }
        d[0] = inf;
        for(int i = 1; i <= n; i++) {
            int p = 0;
            for(int j = 1; j <= n; j++) {
                if(!vis[j] && d[j] < d[p]) {
                    p = j;
                }
            }
            for(int j = 1; j <= n; j++) {
                chkmin(d[j], d[p] + G[p][j]);
            }
            vis[p] = true;
        }
        for(int i = 1; i <= n; i++) printf("%lld
    ", 1LL * (n - 1) * mine + d[i]);
        return 0;
    }
    
    /*
    */
  • 相关阅读:
    HDU 1075 What Are You Talking About(字典树)
    HDU 1075 What Are You Talking About (stl之map映射)
    HDU 1247 Hat’s Words(字典树活用)
    字典树HihoCoder
    HDU 1277全文检索(字典树)
    HDU 3294 Girls' research(manachar模板题)
    HDU 3294 Girls' research(manachar模板题)
    HDU 4763 Theme Section(KMP灵活应用)
    Ordering Tasks UVA
    Abbott's Revenge UVA
  • 原文地址:https://www.cnblogs.com/CJLHY/p/11098059.html
Copyright © 2011-2022 走看看