最小生成树——局域网

题目背景

某个局域网内有n(n<=100)台计算机,因为搭建局域网时工做人员的疏忽,如今局域网内的链接造成了回路,咱们知道若是局域网造成回路那么数据将不停的在回路内传输,形成网络卡的现象。由于链接计算机的网线自己不一样,因此有一些连线不是很畅通,咱们用f(i,j)表示i,j之间链接的畅通程度,f(i,j)值越小表示i,j之间链接越通畅,f(i,j)为0表示i,j之间无网线链接。ios

题目描述

须要解决回路问题,咱们将除去一些连线,使得网络中没有回路,而且被除去网线的Σf(i,j)最大,请求出这个最大值。算法

输入格式:网络

第一行两个正整数n kspa

接下来的k行每行三个正整数i j m表示i,j两台计算机之间有网线联通,通畅程度为m。code

输出格式:blog

一个正整数,Σf(i,j)的最大值ci

 

一道很是很是很是裸的同时又是很是基础的最小生成树的题,直接用prim算法。先求出总的权值的和,而后用prim累加最小权值和,前者减去后者就是最大值。string

代码奉上:io

#include<cstdio>
#include<iostream> 
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
int a,b,c,i,j,k,l,m,n,inf=9999999,sum,max1;
int e[101][101],minn[101];
bool u[101];
int main()
{
    cin>>n>>m;
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    if(i==j)
    e[i][j]=0;
    else
    e[i][j]=inf;//构造邻接矩阵 
    for(i=1;i<=m;i++)
    {
        cin>>a>>b>>c;
        e[a][b]=e[b][a]=c;
        max1+=c;//max储存全部的畅通程度 
}//读入数据并存入矩阵
    memset(minn,0x7f,sizeof(minn));
    minn[1]=0;    
    memset(u,1,sizeof(u));//初始化为True,表示全部点未被访问 
    for(i=1;i<=n;i++)
    {
        k=0;
        for(j=1;j<=n;j++)//寻找一个与已访问的点相连的权值最小的未被访问的点k 
        if(u[j] && minn[j]<minn[k])
        k=j;
        u[k]=false;//将k加入最小生成树,标记已访问 
        for(j=1;j<=n;j++)//修改与k相连的全部未被访问的点 
        if(u[j] && e[k][j]<minn[j])
        minn[j]=e[k][j];
    }
    for(i=1;i<=n;i++)
    sum+=minn[i];//累加权值 
    cout<<max1-sum;
    return 0;
}
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息