题目描述
某个局域网内有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)的最大值
样例数据
input
5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2
output
8
数据规模与约定
1≤n≤100
CODE
#include<bits/stdc++.h>
using namespace std;
int d[105],e[105][105],n,m;
bool u[105];
int prim(int cur)
{
int i,j;
int sum=0;
int index=cur;
memset(u,false,sizeof(u));
u[cur]=true;
for(i=1;i<=n;i++)
{
d[i]=e[cur][i];
}
for(j=1;j<n;j++)
{
int minn=10000;
for(i=1;i<=n;i++)
{
if(!u[i] && d[i]<minn)
{
minn=d[i];
index=i;
}
}
u[index]=true;
sum+=minn;
for(i=1;i<=n;i++)
{
if(!u[i] && d[i]>e[index][i])
{
d[i]=e[index][i];
}
}
}
return sum;
}
int main()
{
int i,j,r=0;
cin>>n>>m;
memset(e,10000,sizeof(e));
for(i=1;i<=m;i++)
{
int a,b,w;
cin>>a>>b>>w;
r+=w;
e[a][b]=w;
e[b][a]=w;
}
int t=prim(1);
cout<<r-t;
return 0;
}