题目背景
某个局域网内有 n(n≤100) 台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象。因为连接计算机的网线本身不同,所以有一些连线不是很畅通,我们用 f(i,j) 表示 i,j 之间连接的畅通程度,f(i,j) 值越小表示 i,j 之间连接越通畅,f(i,j) 为 0 表示 i,j 之间无网线连接。
题目描述
需要解决回路问题,我们将除去一些连线,使得网络中没有回路,并且被除去网线的 ∑f(i,j) 最大,请求出这个最大值。
输入格式
第一行两个正整数 n,k。
接下来的 k 行每行三个正整数 i,j,m 表示 i,j 两台计算机之间有网线联通,通畅程度为 m。
输出格式
一个正整数∑f(i,j) 的最大值。
输入输出样例
输入 #1复制
5 5 1 2 8 1 3 1 1 5 3 2 4 5 3 4 2
输出 #1复制
8
说明/提示
f(i,j)<=1000
题解如下
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int u,v,w,next;
bool operator < (const node &a)const{
return w<a.w;
}
}e[1010101];
int m,n;
int f[1010101];
int getf(int x){
return f[x]==x?x:f[x]=getf(f[x]);
}
int kruskal(){
int val=0,cnt=0;
sort(e+1,e+1+m);
for(int i=1;i<=m;i++){
int u=e[i].u,v=e[i].v;
int xx=getf(u);
int yy=getf(v);
if(xx!=yy){
cnt++,val+=e[i].w,f[xx]=yy;
}
if(cnt==n-1) return val;
}
return 0;
}
int ans=0;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++){
cin>>e[i].u>>e[i].v>>e[i].w;
ans+=e[i].w;
}
int x=kruskal();
cout<<ans-x;
return 0;
}
如有疑问可以点击http://t.csdn.cn/hWgJa参考思路和讲解