• B. Hierarchy


    http://codeforces.com/problemset/problem/17/B

    用邻接矩阵建图后,

    设cost[v]表示去到顶点v的最小值。

    很多个人去顶点v的话,就选最小的那个就OK

    然后,如果有大于等于2个人的cost[v]是inf的,就不符合boss只有一个这个规矩。-1

    不应该只统计有孤立点就输出-1,因为m可以等于0(坑)

    另外这个图是不会有环的,因为有环就表明相对大小乱了。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #define IOS ios::sync_with_stdio(false)
    using namespace std;
    #define inf (0x3f3f3f3f)
    typedef long long int LL;
    
    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <set>
    #include <map>
    #include <queue>
    #include <string>
    const int maxn = 1e3 + 20;
    int e[maxn][maxn];
    int cost[maxn];
    struct node {
        int u, v, w;
        int tonext;
    }E[10000 + 20];
    int first[maxn];
    int has[maxn];
    int num;
    void add(int u, int v, int w) {
        ++num;
        E[num].u = u;
        E[num].v = v;
        E[num].w = w;
        E[num].tonext = first[u];
        first[u] = num;
    }
    int a[maxn];
    void work() {
        int n;
        cin >> n;
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
        }
        int m;
        cin >> m;
        memset(e, 0x3f, sizeof e);
        for (int i = 1; i <= m; ++i) {
            int u, v, w;
            cin >> u >> v >> w;
            if (a[u] > a[v]) {
                has[v] = 1;
                has[u] = 1;
                e[u][v] = min(e[u][v], w);
            }
        }
        memset(cost, 0x3f, sizeof cost);
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (e[i][j] != inf) {
                    add(i, j, e[i][j]);
                }
            }
        }
        for (int i = 1; i <= n; ++i) {
            for (int j = first[i]; j; j = E[j].tonext) {
                int v = E[j].v;
                cost[v] = min(cost[v], E[j].w);
            }
        }
        int ans = 0;
        int t = 0;
        for (int i = 1; i <= n; ++i) {
            if (cost[i] == inf) { //不能到达
                t++; //有一个没有老板了,
                if (t == 2) { //2个没有就不行了
                    cout << -1 << endl;
                    return;
                }
                continue;
            }
            ans += cost[i];
        }
        cout << ans << endl;
    }
    
    int main() {
    #ifdef local
        freopen("data.txt","r",stdin);
    #endif
        IOS;
        work();
        return 0;
    }
  • 相关阅读:
    苹果p12文件--一个苹果证书怎么多次使用(蛋疼,这些问题只有和其他企业合作才会遇到,别人的账号不可能给你,蛋疼....)
    xcode 树形管理 cocos2d-x的资源
    cocos2d-x 扩充引擎基类功能 引起的头文件重复包含问题的分析
    pytest--运行指定的测试和参数化
    adb--常用命令
    appium--desktop
    adb--环境安装
    pytest--命令行常用参数
    django -- auth模块
    pytest--常用插件
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/6032218.html
Copyright © 2020-2023  润新知