Prim / Kruskal - 局域网 - 洛谷 P2820

某个局域网内有 n 台计算机和 k 条 双向 网线,计算机的编号是 1∼n。由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象。

注意:

对于某一个连接,虽然它是双向的,但我们不将其当做回路。本题中所描述的回路至少要包含两条不同的连接。
两台计算机之间最多只会存在一条连接。

不存在一条连接,它所连接的两端是同一台计算机。

因为连接计算机的网线本身不同,所以有一些连线不是很畅通,我们用 f(i,j) 表示 i,j 之间连接的畅通程度,f(i,j) 值越小表示 i,j 之间连接越通畅。

现在我们需要解决回路问题,我们将除去一些连线,使得网络中没有回路且不影响连通性(即如果之前某两个点是连通的,去完之后也必须是连通的),并且被除去网线的 Σf(i,j) 最大,请求出这个最大值。

输入格式

第一行两个正整数 n,k。

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

输出格式

一个正整数,表示被除去网线的 Σf(i,j) 的最大值。

数据范围

1≤n≤100,0≤k≤200,1≤f(i,j)≤10001≤n≤100, 0≤k≤200, 1≤f(i,j)≤10001≤n≤100,0≤k≤200,1≤f(i,j)≤1000

输入样例:

5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2

输出样例:

8

分析:

根据题意:给定一个包含多个连通块的图,要从每个连通块中去除几条边。根据题意:给定一个包含多个连通块的图,要从每个连通块中去除几条边。根据题意:给定一个包含多个连通块的图,要从每个连通块中去除几条边。

要求:去除几条边后,每个连通块中的点的数量不变,换言之,不改变任何两点之间的连通性。要求:去除几条边后,每个连通块中的点的数量不变,换言之,不改变任何两点之间的连通性。要求:去除几条边后,每个连通块中的点的数量不变,换言之,不改变任何两点之间的连通性。

要求去除掉的所有边的权值之和的最大值。要求去除掉的所有边的权值之和的最大值。要求去除掉的所有边的权值之和的最大值。

等价于求,将所有连通块变成最小生成树后,需要去掉的边的权值之和。等价于求,将所有连通块变成最小生成树后,需要去掉的边的权值之和。等价于求,将所有连通块变成最小生成树后,需要去掉的边的权值之和。

解决方案:解决方案:解决方案:

①、Prim算法:逐个向集合中添加到连通块距离最短的点,直到剩下的点与当前连通块不连通。①、Prim算法:逐个向集合中添加到连通块距离最短的点,直到剩下的点与当前连通块不连通。①、Prim算法:逐个向集合中添加到连通块距离最短的点,直到剩下的点与当前连通块不连通。

当剩下的点都不连通时,会默认选择一个未被标记过的点t,接着更新与t相邻的点的距离,计算新的连通块。\qquad当剩下的点都不连通时,会默认选择一个未被标记过的点t,接着更新与t相邻的点的距离,计算新的连通块。当剩下的点都不连通时,会默认选择一个未被标记过的点t,接着更新与t相邻的点的距离,计算新的连通块。

这样,我们先累加输入的所有边的权值总和tot,再对所有连通块求最小生成树,代价res,输出tot−res。\qquad这样,我们先累加输入的所有边的权值总和tot,再对所有连通块求最小生成树,代价res,输出tot-res。这样,我们先累加输入的所有边的权值总和tot,再对所有连通块求最小生成树,代价res,输出tot−res。

注意,只有当连通的时候我们才累加到各连通块最小生成树的总代价中,即dis[j]≠inf时,才累加。\qquad注意,只有当连通的时候我们才累加到各连通块最小生成树的总代价中,即dis[j]≠inf时,才累加。注意,只有当连通的时候我们才累加到各连通块最小生成树的总代价中,即dis[j]​=inf时,才累加。

②、Kruskal算法:方便用于处理多个连通块的最小生成树。②、Kruskal算法:方便用于处理多个连通块的最小生成树。②、Kruskal算法:方便用于处理多个连通块的最小生成树。

但是注意,要求去除的边的权值之和,故我们要累加被舍弃掉的边的权值。\qquad但是注意,要求去除的边的权值之和,故我们要累加被舍弃掉的边的权值。但是注意,要求去除的边的权值之和,故我们要累加被舍弃掉的边的权值。

代码:

Prim算法:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>using namespace std;const int N=110, inf=0x3f3f3f3f;int n,m,g[N][N],dis[N];
bool st[N];int prim()
{memset(dis,0x3f,sizeof dis);dis[1]=0;int res=0;for(int i=0;i<n;i++){int t=-1;for(int j=1;j<=n;j++)if(!st[j] && (t==-1 || dis[t]>dis[j]))t=j;if(dis[t]!=inf) res+=dis[t];st[t]=true;for(int j=1;j<=n;j++) dis[j]=min(dis[j],g[t][j]);}return res;
}int main()
{scanf("%d%d",&n,&m);memset(g,0x3f,sizeof g);int a,b,c,tot=0;for(int i=0;i<m;i++){scanf("%d%d%d",&a,&b,&c);g[a][b]=g[b][a]=min(g[a][b],c);tot+=c;}int t=prim();printf("%d\n",tot-t);return 0;
}

Kruskal算法:

#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int N=210;int n,m;
int p[N];
struct edge
{int u,v,w;bool operator < (const edge &t) const{return w<t.w;}
}E[N];int Find(int x)
{if(p[x]!=x) return p[x]=Find(p[x]);return p[x];
}int kruskal()
{sort(E,E+m);int ans=0;for(int i=0;i<m;i++){int pu=Find(E[i].u),pv=Find(E[i].v);if(pu!=pv) p[pu]=pv;else ans+=E[i].w;}return ans;
}int main()
{cin>>n>>m;for(int i=0;i<m;i++) cin>>E[i].u>>E[i].v>>E[i].w;for(int i=1;i<=n;i++) p[i]=i;int res=kruskal();cout<<res<<endl;return 0;
}

Prim / Kruskal - 局域网 - 洛谷 P2820相关推荐

  1. 最小生成树 洛谷P3366【模板】最小生成树 洛谷P2820 局域网

    嗯... 理解生成树的概念: 在一幅图中将所有n个点连接起来的n-1条边所形成的树. 最小生成树: 边权之和最小的生成树. 最小瓶颈生成树: 对于带权图,最大权值最小的生成树. 如何操作? 1.Pri ...

  2. 洛谷——P2820 局域网

    P2820 局域网 题目背景 某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成 ...

  3. 洛谷.4172.[WC2006]水管局长(LCT Kruskal)

    题目链接 洛谷(COGS上也有) 不想去做加强版了..(其实处理一下矩阵就好了) 题意: 有一张图,求一条x->y的路径,使得路径上最长边尽量短并输出它的长度.会有<=5000次删边. 这 ...

  4. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  5. 信息学奥赛一本通 1392:繁忙的都市(city) | 洛谷 P2330 [SCOI2005]繁忙的都市

    [题目链接] ybt 1392:繁忙的都市(city) 洛谷 P2330 [SCOI2005]繁忙的都市 [题目考点] 1. 图论 最小生成树 [解题思路] 将题目叙述转为图论概念,交叉路口为顶点,道 ...

  6. [bzoj1601]灌水(洛谷P1550)

    [USACO08OCT]Watering Hole G 洛谷灌水区 传送门 D e s c r i p t i o n Description Description Farmer John已经决定把 ...

  7. 洛谷P1194 买礼物

    洛谷P1194 买礼物 在买了第一次之后,你还要买 n-1次,把所有点都连起来,这样做一个最小生成树 就行了,然后要注意题目中说了如果a[ i ][ j ]==0 则表示两个点是不相连的,赋值 inf ...

  8. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  9. 【题解】【洛谷 P1967】 货车运输

    目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...

最新文章

  1. 当Python遇上朱茵、迪丽热巴、林志玲、王祖贤等众多美女
  2. int和Integer的区别在哪里
  3. 迁移学习——Domain Adaptation
  4. 《转》VMware vSphere 5.1 学习系列之四:安装 SQL Server 数据库
  5. 一刷leetcode——计算几何
  6. write solid code 零散(原文)
  7. tdi_fw贴码析(TDI开源网络防火墙分析)
  8. 机器学习下一个万亿级的增长从哪来?
  9. FrameBuffer研究
  10. PHP学习总结(14)——PHP入门篇之常用运算符
  11. jquery实现增删改(伪)-老男孩作业day13
  12. matlab空间球与空间圆求解,基于MATLAB的球管相贯空间曲线焊缝的数学模型
  13. html5有哪些优点,HTML5真正的优势优点有什么?
  14. 初级软件水平测试题,2020初级会计题库软件机考系统练习试卷
  15. EBSD Channel5软件
  16. 移动数据和移动计算(本地计算)的区别
  17. 基于MATLAB的手机定位精度评估算法的仿真
  18. 如何删除QQ中的锁定QQ热键Ctrl+Alt+L?
  19. Idea 文件定位图标显示与关闭 -- idea ver:2020.1
  20. 又来神器推荐嘞xshell与winSCP

热门文章

  1. 很好的古典文学电子书下载网站
  2. STM32的超声波测距程序
  3. 修改时验证名称是否重复除了本身
  4. oracle数据库dba面试题,DBA笔试题5:SQL汇总
  5. 拿走不谢!固件逆向分析过程中的工具和技巧(上)
  6. vue uniapp 折叠功能实现
  7. 黑马程序员--C语言基础之--scanf函数
  8. Java concurrent
  9. python飞机大战功能模块图_基于Python的飞机大战游戏设计
  10. 李炎恢ECMAScript6 / ES6+(二)