C++原题题目描述:
某个局域网内有 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
请问,如何使用最小生成树算法解答?
我的答案:
#include<bits/stdc++.h>
using namespace std;
const int maxx=101;
int tot;
int n,k;
int a[maxx][maxx];
int mincost[maxx];
bool used[maxx];
int prim()
{
int cmp,v;
for (int i = 0; i < n; i++)
{
used[i]=false;
mincost[i]=a[0][i];
}
used[0]=true;
for (int j = 1; j < n; j++)
{
cmp=INT_MAX;
for (int i = 0; i < n; i++)
{
if(!used[i]&&mincost[i]<cmp)
{
cmp=mincost[i];
v=i;
}
}
tot+=cmp;
used[v]=1;
for (int i = 0; i < n; i++)
{
if(!used[i]&&a[v][i]<mincost[i]) mincost[i]=a[v][i];
}
}
return tot;
}
int main()
{
cin>>n>>k;
for(int i=0;i<k;i++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin>>a[i][j];
}
}
cout<<prim()<<endl;
tot=0;
}
return 0;
}