题目链接:https://codeforces.com/contest/17/problem/B
每个点留下最小花费的上司,看最后是不是只有一个根节点。
#include <iostream> #include <cstring> #include <algorithm> using namespace std; static const int MAXN=1e3+10; int q[MAXN]; int n,m,u,v,w; int cost[MAXN]; bool vis[MAXN]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&q[i]); scanf("%d",&m); memset(cost,0x3f,sizeof(cost)); for(int i=0;i<m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); if(q[u]>q[v]) { cost[v]=min(cost[v],w); vis[v]=true; } } int res=0,cnt=0; for(int i=1;i<=n;i++) if(vis[i]) res+=cost[i]; else cnt++; if(cnt==1) printf("%d\n",res); else puts("-1"); return 0; }