zoukankan      html  css  js  c++  java
  • 最小生成树——局域网

    题目背景

    某个局域网内有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)的最大值

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

    代码奉上:

    #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;
    }
  • 相关阅读:
    yum只下载不安装的方法
    在VS2008下编译Qt4.4.x
    Linux sh脚本异常:bad interpreter: No such file or directory
    动态链接库dll,静态链接库lib, 导入库lib 转
    Accumulation Buffer(累积缓存)
    mysql中ip和整数的转换
    开车撞人了!
    windows 下getc()返回0x1A表示EOF
    NPC问题
    关于普华永道、麦肯锡和IBM的笑话
  • 原文地址:https://www.cnblogs.com/wty20010315/p/6700493.html
Copyright © 2011-2022 走看看