http://vjudge.net/contest/view.action?cid=48014#problem/B
Description
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: «employeeai 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 m lines contain the applications themselves, each of them in the form of three space-separated numbers: ai, bi and ci (1 ≤ ai, bi ≤ n, 0 ≤ 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 Input
4 7 2 3 1 4 1 2 5 2 4 1 3 4 1 1 3 5
11
3 1 2 3 2 3 1 2 3 1 3
-1
Hint
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.
解题思路:本来是想着用并查集做来,可是对于题目的要求,会出现不是树的情况,那样不好处理。后来看看学长以前的代码发现我其实是想的复杂了==
首先对每一个员工的地位值进行从小到大排序,那么地位最高的那个人是不会有上级的其余的人必须都要满足有上级才 行,否则输出-1,在满足每一个人都有上级 的情况下,选择二者搭档费用最小的搭档,最后的费用总值即为所求。
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct per
{
int num,q;
};
int cmp(per a,per b)
{
return a.q<b.q;
}
int main()
{
int n,m;per data[1005];int ap[10005][3];
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>data[i].q,data[i].num=i+1;
sort(data,data+n,cmp);
cin>>m;
for(int i=0;i<m;i++)
cin>>ap[i][0]>>ap[i][1]>>ap[i][2];
int f=1,ans=0;
for(int i=0;i<n-1;i++)
{
int w=99999999;int flag=0;
for(int j=0;j<m;j++)
{
if(data[i].num==ap[j][1]&&ap[j][2]<w)
w=ap[j][2],flag=1;
}
if(flag==0)
{
f=0;break;
}
ans+=w;
}
if(!f)
cout<<-1<<endl;
else
cout<<ans<<endl;
}
return 0;
}