【输入样例】
5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2
【输出样例】
8
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=110;
int n,k,sum,w[N][N],dis[N],vis[N];
int prim(){
int res=0;
memset(dis,0x3f,sizeof dis);
dis[1]=0;
for(int i=0;i<n;i++){
int t=-1;
for(int j=1;j<=n;j++)
if(!vis[j]&&(t==-1||dis[t]>dis[j])) t=j;
res+=dis[t];
vis[t]=1;
for(int j=1;j<=n;j++)
if(w[t][j]&&!vis[j])
dis[j]=min(dis[j],w[t][j]);
}
return res;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
w[a][b]=w[b][a]=c;
sum+=c;
}
printf("%d",sum-prim());
return 0;
}
Kruskal
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5,INF=0x3f3f3f3f;
int n,k,sum,p[N];
struct node{
int from,to,w;
bool operator<(const node& a)const{
return a.w>w;
}
}edges[N];
int find(int x){
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int Kruskal(){
sort(edges,edges+k);
for(int i=1;i<=n;i++) p[i]=i;
int res=0,cnt=0;
for(int i=0;i<k;i++){
int a=edges[i].from,b=edges[i].to,w=edges[i].w;
a=find(a),b=find(b);
if(a!=b){
p[a]=b;
res+=w;
cnt++;
}
}
if(cnt<n-1) return INF;
return res;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++){
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
edges[i]={a,b,w};
sum+=w;
}
printf("%d",sum-Kruskal());
return 0;
}