【题目描述】
某个局域网内有n(n≤100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象。因为连接计算机的网线本身不同,所以有一些连线不是很畅通,我们用f(i,j)表示i,j之间连接的畅通程度(f(i,j)≤1000),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)的最大值。
【输入样例】
5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2
【输出样例】
8
最小生成树
把值较大的网线切掉
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,z,i,c[101][101],minn,s[101],t,ct,f[101],maxn,k;
int main(){
cin>>n>>m;
for(i=1;i<=n;i++)
{
s[i]=9999999;//初始化
}
for(i=1;i<=m;i++)
{
cin>>x>>y>>z;
c[x][y]=z;
c[y][x]=z;
k+=z;
}
f[1]=1;
s[1]=0;
ct=1;
t=1;
while(ct<n)
{
for(i=1;i<=n;i++)
{
if(c[t][i]!=0&&f[i]==0)
{
s[i]=min(s[i],c[t][i]);//保留较小的
}
}
minn=9999999;
for(i=1;i<=n;i++)
{
if(f[i]==0)
{
if(s[i]<minn)
{
minn=s[i];
t=i;
}
}
}
f[t]=1;
ct++;
}
for(i=1;i<=n;i++)
{
maxn+=s[i];
}
cout<<k-maxn;//请注意
}