题目
n
n
n个点,
m
m
m条边,求变成一个最小生成树所需要删去的边权和
分析
求的其实是最小生成树,删去的边的和就是答案。
代码
#include <cstdio>
#include <cctype>
#include <climits>
#include <cstring>
using namespace std;
int a[101][101],lowcost[101],v[101];
inline int in(){
char x=getchar(); int ans=0;
while (!isdigit(x)) x=getchar();
while (isdigit(x)) ans=ans*10+x-48,x=getchar();
return ans;
}
int main(){
int ans=0,n,m,k,x1,y1,min,s=0; n=in(),m=in(); memset(a,127,sizeof(a)); memset(lowcost,127,sizeof(lowcost));
for (int i=1;i<=m;i++) x1=in(),y1=in(),a[x1][y1]=in(),a[y1][x1]=a[x1][y1],ans+=a[x1][y1];
for (int i=1;i<=n;i++) lowcost[i]=a[1][i];v[1]=1;
for (int i=1;i<=n-1;i++){
min=INT_MAX;
for (int j=1;j<=n;j++)
if (lowcost[j]<min&&!v[j]){//最小值
min=lowcost[j];
k=j;
}
s+=min;
v[k]=1;
for (int j=1;j<=n;j++) if (a[k][j]<lowcost[j]) lowcost[j]=a[k][j];//更新最小值
}
printf("%d",ans-s); return 0;
}