| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 38892 | 氩_wjy | 【S】T4 | C++ | 通过 | 100 | 952 MS | 114120 KB | 1525 | 2025-11-12 16:59:55 |
#include<bits/stdc++.h> #define int long long using namespace std; const int N=5e5+7; int n,m,a[N]; set<int> Ban[N]; struct Edge{ int u,v,w; bool operator<(const Edge x){return w<x.w;} }E[N<<1]; vector<Edge> G; inline bool cmp(int u,int v){return a[u]==a[v]?u<v:a[u]<a[v];} int p[N]; int f[N]; inline void Init(){ for(int i=1;i<=n;i++)f[i]=i; }inline int Find(int x){ return f[x]==x?x:f[x]=Find(f[x]); } signed main(){ cin>>n>>m; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=m;i++){ int u,v,w; cin>>u>>v>>w; E[i]=(Edge){u,v,w}; if(a[u]>a[v]||(a[u]==a[v]&&u>v))swap(u,v); Ban[u].insert(v); } for(int i=1;i<=n;i++)p[i]=i; sort(p+1,p+n+1,cmp); int ECount=0; Init(); for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ auto it=Ban[p[i]].lower_bound(p[j]); if(it!=Ban[p[i]].end() && ((*it)==p[j]))continue; if(Find(p[i])==Find(p[j]))continue; G.push_back((Edge){p[i],p[j],a[p[i]]}); f[Find(p[i])]=Find(p[j]); if(G.size()>=n-1)break; }if(G.size()>=n-1)break; } Init(); for(int i=0;i<G.size();i++)E[m+i+1]=G[i]; // for(auto e:G)cout<<e.u<<" "<<e.v<<" "<<e.w<<endl; m+=G.size(); sort(E+1,E+m+1); int Ans=0; for(int i=1;i<=m;i++){ if(Find(E[i].u)==Find(E[i].v))continue; Ans+=E[i].w; f[Find(E[i].u)]=Find(E[i].v); }cout<<Ans<<endl;return 0; }