最小生成树——局域网

题目背景

某个局域网内有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;
}
时间: 2024-12-15 02:23:31

最小生成树——局域网的相关文章

Problem I: 俊爷的局域网

分析:这道题就是要求求出俊爷能赚我多少钱! 然后这道题中,俊爷建设的所有路径都是最短的,然后还要求求出在这些最短路径中路径最大的一个--maxcost! 由于是最短路径了,所以我需要的支付的钱为:maxcost*(n-1):实际所花的钱其实就是将每条路径所花的钱的总和! 然后怎么求出每条路径的花费呢?那么就是使用最小生成树来解决了!在建立最小生成树的时候便可求出最大值maxcost了! 然后剩下的就好办了,直接就是一个减法就ok了! 代码如下: #include<cstdio> #includ

win7搭建局域网时间服务器

近日,本人想在局域网内通过普通的windows 7 PC搭建一台NTP服务器,可看似简单的配置却给我捣腾了了半天.初期,参考了互联网的上相关的配置文档,可网络设备就是死活不同步NTP服务器的时间.实在没办法,只有通过来抓包分析了,经过一番研究后,终于找到问题,现将这个文档与大家分享: 通过windows系统为局域网搭建NTP服务器,为局域网内网络设备提供时间服务,经过测试,使用于windows xp.windows 2003.windows 7. 1.启用 NTPServer.为此,请按照下列步

次最小生成树 模版

次小生成树(转) 转载(http://www.cnblogs.com/z360/p/6875488.html) 所谓次小生成树,顾名思义就是从生成树中取出的第二小的生成树. 我们在前面已经说过最小生成树的概念及代码实现了,所以接下来要说的次小生成树应该比较简单理解了. 求次小生成树的两种方法 1:首先求出最小生成树T,然后枚举最小生成树上的边,计算除了枚举的当前最小生成树的边以外的所有边形成的最小生成树Ti,然后求最小的Ti就是次小生成树.2:首先计算出最小生成树T,然后对最小生成树上任意不相邻

局域网聊天【带照片】

package com.kaige123;/** * 消息页面 * @author 凯哥 * */public class MessageFrame extends JFrame {    //把消息分成两部分    private JSpinner spinner = new JSpinner();    //发送文本框    public JTextArea textArea = new JTextArea();    //网络名称    private String uname="&quo

HDU1863 畅通工程---(最小生成树)

畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27972    Accepted Submission(s): 12279 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出

51Nod1601 完全图的最小生成树计数

传送门 我居然忘写题解啦!(记忆废) 不管怎么说,这题还算是一道好题啊--你觉得敦爷出的题会有水题么 -- 这题比较容易把人误导到Boruvka算法之类的东西上去(我们机房去刚D题的人一开始大多也被误导了),但仔细思考之后是可以发现问题的特殊性质的. 听说很多人是从Kruskal算法想到这道题的做法的?好吧我并不是,那我就写写我的思考过程好了-- 记得算导上有一道思考题,判断一个最小生成树算法的正确性.那个算法是这样的:把当前图的点集随意划分成两半,递归两半后选出连接两个点集的边中权值最小的一条

如何做一个小型局域网的优秀网管?

这里的小型局域网一般是指21--50台的环境,这样规模的企业局域网,很多不会有专业网管,有的领导,人事兼职就可以做到,借助一些上网行为管理产品,路由,也能对员工上网行为管理,那么管理到什么程度,也看各家见仁见智了.所谓上网管理,就是内容和行为. 在线查看,局域网电脑台数不多,在线查看各个电脑对应多少流量,实时流量图,一目了然. 最重要局域网行为管理,禁止和工作不相关的行为,各种推送通知,各种报表根据各个局域网管理制度制定策略.(各种报表精确统计) 3.带宽流量智能管理,分配带宽,限速. 一个盒子

最小生成树求法 Prim + Kruskal

prim算法的思路 和dijkstra是一样的 每次选取一个最近的点 然后去向新的节点扩张 注意这里的扩张 不再是 以前求最短路时候的到新的节点的最短距离 而是因为要生成一棵树 所以是要连一根最短的连枝 所以关键部分修改一下 dist[u] = min(dist[u], e.cost) --->>e是连接 v 和 u的边 同样地 普同写法O(v^2) 用队列优化后O(E*logV) 1 #include <iostream> 2 #include <stdio.h> 3

[讨论] win7封装时如何直接开通局域网共享

ekincheng 发表于 2016-10-31 20:17:54 https://www.itsk.com/thread-371838-1-5.html Win7封装时不能像XP那样直接开启局域网共享 Win7共享要点开始 运行输入secpol.msc 1.安全设置→本地策略→用户权限分配→拒绝从网络访问计算机删除Guest2.安全设置→安全选项→   1.网络访问:本地账户的共享和安全模型  调试为  “仅来宾-对本地用户进行身份验证为来宾”   2.账户:使用空密码的本地账户只允许进行控制