前言
被坑了…(我超 数组开小了竟然不提示RE 而是TLE)
cf果然还是cf啊
思路
显然这题看上去什么也不像 (不是 d p dp dp 就是贪心什么的
按照贪心的角度来考虑,每次拿最小还未有父节点的边加入集合即可
所以我们排个序 然后加进去就行
CODE
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
typedef pair<int,int> pii;C
//map<int,int> mp;
const int N = 1e4+10;
struct node
{
int a,b,c;
}g[N];
bool cmp(node x,node y)
{
return x.c<y.c;
}
int n,m;
int q[N];
bool p[N];
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>q[i];
cin>>m;
for(int i=1;i<=m;i++)
cin>>g[i].a>>g[i].b>>g[i].c;
sort(g+1,g+1+m,cmp);
int cnt= 0 ;
int ans = 0 ;
for(int i=1;i<=m;i++)
{
int a = g[i].a,b = g[i].b,c = g[i].c;
if(!p[b] && q[a]>q[b]){
p[b] = 1;
ans+=c;
cnt++;
}
if(cnt == n-1)
break;
}
if(cnt == n-1)
cout<<ans<<endl;
else
cout<<-1<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
//int t;cin>>t;while(t -- )
solve();
return 0;
}