[noi39]子图
小w喜欢的图可以发现就是一棵森林(是不是很神奇,其实易证:如果有环那么环本身就不合法,如果没有环那么显然合法)。继续研究发现删边最小<=>选边最大<=>最大生成森林,kruskal跑一下即可。
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int x,y,z; 5 }a[500001]; 6 int n,m,f[500001]; 7 long long ans; 8 bool cmp(ji x,ji y){ 9 return x.z>y.z; 10 } 11 int find(int k){ 12 if (k==f[k])return k; 13 return f[k]=find(f[k]); 14 } 15 int main(){ 16 scanf("%d%d",&n,&m); 17 for(int i=1;i<=m;i++){ 18 scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z); 19 ans+=a[i].z; 20 } 21 sort(a+1,a+m+1,cmp); 22 for(int i=1;i<=n;i++)f[i]=i; 23 for(int i=1;i<=m;i++) 24 if (find(a[i].x)!=find(a[i].y)){ 25 f[find(a[i].x)]=find(a[i].y); 26 ans-=a[i].z; 27 } 28 printf("%lld",ans); 29 }