题目:局域网
思路:
kruskal求最小生成树。
使得图中没有回路且联通也就是图中仅仅剩下一颗生成树,要求删掉的值最大也就是求最小生成树。
代码:
#include<bits/stdc++.h>
using namespace std;
struct Edge{
int x,y,z;
Edge(){}
Edge(int xx,int yy,int zz){
x=xx,y=yy,z=zz;
}
bool operator <(const Edge& oth) const {
return z<oth.z||(z==oth.z&&(y<oth.y||(y==oth.y&&x<oth.x)));
}
};
int n,m;
Edge a[10005];
int fa[10005];
int sum=0,ans=0;
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void kruskal(){
for(int i=1;i<=m;i++){
int f1=find(a[i].x),f2=find(a[i].y);
if(f1==f2) continue;
fa[f1]=f2;
ans+=a[i].z;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
sum+=a[i].z;
}
sort(a+1,a+m+1);
for(int i=1;i<=m;i++) fa[i]=i;
kruskal();
printf("%d",sum-ans);
return 0;
}