• CF 17B Hierarchy


    Nick's company employed n people. Now Nick needs to build a tree hierarchy of «supervisor-surbodinate» relations in the company (this is to say that each employee, except one, has exactly one supervisor). There are m applications written in the following form: «employee ai is ready to become a supervisor of employee bi at extra cost ci». The qualification qj of each employee is known, and for each application the following is true: qai > qbi.

    Would you help Nick calculate the minimum cost of such a hierarchy, or find out that it is impossible to build it.

    Input

    The first input line contains integer n (1 ≤ n ≤ 1000) — amount of employees in the company. The following line contains n space-separated numbers qj (0 ≤ qj ≤ 106)— the employees' qualifications. The following line contains number m (0 ≤ m ≤ 10000) — amount of received applications. The following mlines contain the applications themselves, each of them in the form of three space-separated numbers: ai,bi and ci (1 ≤ ai, bi ≤ n0 ≤ ci ≤ 106). Different applications can be similar, i.e. they can come from one and the same employee who offered to become a supervisor of the same person but at a different cost. For each application qai > qbi.

    Output

    Output the only line — the minimum cost of building such a hierarchy, or -1 if it is impossible to build it.

    Sample test(s)
    input
    4
    7 2 3 1
    4
    1 2 5
    2 4 1
    3 4 1
    1 3 5
    
    output
    11
    
    input
    3
    1 2 3
    2
    3 1 2
    3 1 3
    
    output
    -1
    
    Note

    In the first sample one of the possible ways for building a hierarchy is to take applications with indexes 1, 2 and 4, which give 11 as the minimum total cost. In the second sample it is impossible to build the required hierarchy, so the answer is -1.

    预处理+贪心就能够了,由于根仅仅有一个,所以在输入的时候预处理子节点的最小值贪心就好了=。=
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<limits.h>
    using namespace std;
    const int INF=0x3ffffff;
    int f[1100];
    
    int main()
    {
        int n,m;
        int temp,u,v,w;
        while(cin>>n)
        {
            for(int i=1;i<=n;i++)
            {
                cin>>temp;
                f[i]=INF;
            }
            cin>>m;
            for(int i=1;i<=m;i++)
            {
                cin>>u>>v>>w;
                if(f[v]>w)//预处理最小值
                    f[v]=w;
            }
            int flag=1,k=1;
            int ans=0;
            for(int i=1;i<=n;i++)//仅仅能有一个INF,即根节点
            {
                if(f[i]==INF&&k)
                {
                    ans-=INF;
                    k=0;
                }
                else if(f[i]==INF)
                {
                    flag=0;
                    break;
                }
                ans+=f[i];
            }
            if(flag)
                cout<<ans<<endl;
            else
                cout<<-1<<endl;
        }
        return 0;
    }
    


  • 相关阅读:
    python的特点
    epoll理解(转)
    数据库存储过程、触发器、连接
    Mysql的四种隔离级别
    linux指令
    利用asyncio(支持异步io)和协程实现单线程同步
    ubuntu安装codeblocks
    临界区与互斥量区别
    单链表的简单操作
    hdu 5475 An easy problem(暴力 || 线段树区间单点更新)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5178412.html
Copyright © 2020-2023  润新知