Prim / Kruskal - 局域网 - 洛谷 P2820
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相关推荐
- 最小生成树 洛谷P3366【模板】最小生成树 洛谷P2820 局域网
嗯... 理解生成树的概念: 在一幅图中将所有n个点连接起来的n-1条边所形成的树. 最小生成树: 边权之和最小的生成树. 最小瓶颈生成树: 对于带权图,最大权值最小的生成树. 如何操作? 1.Pri ...
- 洛谷——P2820 局域网
P2820 局域网 题目背景 某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成 ...
- 洛谷.4172.[WC2006]水管局长(LCT Kruskal)
题目链接 洛谷(COGS上也有) 不想去做加强版了..(其实处理一下矩阵就好了) 题意: 有一张图,求一条x->y的路径,使得路径上最长边尽量短并输出它的长度.会有<=5000次删边. 这 ...
- 洛谷 - 试炼场(全部题目备份)
整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...
- 信息学奥赛一本通 1392:繁忙的都市(city) | 洛谷 P2330 [SCOI2005]繁忙的都市
[题目链接] ybt 1392:繁忙的都市(city) 洛谷 P2330 [SCOI2005]繁忙的都市 [题目考点] 1. 图论 最小生成树 [解题思路] 将题目叙述转为图论概念,交叉路口为顶点,道 ...
- [bzoj1601]灌水(洛谷P1550)
[USACO08OCT]Watering Hole G 洛谷灌水区 传送门 D e s c r i p t i o n Description Description Farmer John已经决定把 ...
- 洛谷P1194 买礼物
洛谷P1194 买礼物 在买了第一次之后,你还要买 n-1次,把所有点都连起来,这样做一个最小生成树 就行了,然后要注意题目中说了如果a[ i ][ j ]==0 则表示两个点是不相连的,赋值 inf ...
- 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
[洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...
- 【题解】【洛谷 P1967】 货车运输
目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...
最新文章
- 当Python遇上朱茵、迪丽热巴、林志玲、王祖贤等众多美女
- int和Integer的区别在哪里
- 迁移学习——Domain Adaptation
- 《转》VMware vSphere 5.1 学习系列之四:安装 SQL Server 数据库
- 一刷leetcode——计算几何
- write solid code 零散(原文)
- tdi_fw贴码析(TDI开源网络防火墙分析)
- 机器学习下一个万亿级的增长从哪来?
- FrameBuffer研究
- PHP学习总结(14)——PHP入门篇之常用运算符
- jquery实现增删改(伪)-老男孩作业day13
- matlab空间球与空间圆求解,基于MATLAB的球管相贯空间曲线焊缝的数学模型
- html5有哪些优点,HTML5真正的优势优点有什么?
- 初级软件水平测试题,2020初级会计题库软件机考系统练习试卷
- EBSD Channel5软件
- 移动数据和移动计算(本地计算)的区别
- 基于MATLAB的手机定位精度评估算法的仿真
- 如何删除QQ中的锁定QQ热键Ctrl+Alt+L?
- Idea 文件定位图标显示与关闭 -- idea ver:2020.1
- 又来神器推荐嘞xshell与winSCP