信息学奥赛一本通 1391:局域网(net)

这篇具有很好参考价值的文章主要介绍了信息学奥赛一本通 1391:局域网(net)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【题目链接】

ybt 1391:局域网(net)

【题目考点】

1. 图论:最小生成树

记图中顶点数为V,边数为E

  • Prim算法
    复杂度: O ( V 2 ) O(V^2) O(V2)
  • Prim算法堆优化
    复杂度: O ( E l o g E ) O(E log E) O(ElogE)
  • Kruskal算法
    复杂度: O ( E l o g E ) O(E log E) O(ElogE)

【解题思路】

每台电脑是一个顶点,两台电脑间的网线是边。两台电脑间连接的通畅程度 f ( i , j ) f(i,j) f(i,j)就是两个顶点之间边的权值。
一个局域网中任何两台电脑都可以连通,也就是说图中任意两顶点之间都有路径。
要使n个顶点的图中任意两顶点之间都有路径,而且没有回路,那么就需要不断去掉边,剩下的图是原图的生成树。
要使得去掉边的权值加和最大,那么就是要求剩下的生成树的所有边的权值加和最小。
因此该题需要求原图的最小生成树,求出最小生成树的边权值加和,用原图所有边的权值加和减去最小生成树的边权值加和,即为去掉的边权值加和的最大值。文章来源地址https://www.toymoban.com/news/detail-650505.html

【题解代码】

解法1:Prim算法
#include <bits/stdc++.h>
using namespace std;
#define N 105
struct Edge
{
	int v, w;
	Edge(){}
	Edge(int a, int b):v(a),w(b){}
};
vector<Edge> edge[N];
bool vis[N];//vis[i]:顶点i是否已被选择
int dis[N];//dis[i]:顶点i距离被选择顶点的最小距离 
int n, m, sumTree, sumAll;//sumAll:所有边的权值加和 sumTree:最小生成树的权值加和 
void prim()
{
	memset(dis, 0x3f, sizeof(dis));
	dis[1] = 0;//先选择顶点1 
	for(int k = 1; k <= n; ++k)//循环n次,每次取出一个顶点 
	{
		int u = 0;//dis中最小值的下标 
		for(int i = 1; i <= n; ++i)
			if(vis[i] == false && (u == 0 || dis[i] < dis[u]))
				u = i;
		sumTree += dis[u];
		vis[u] = true;
		for(Edge e : edge[u])
		{
			int v = e.v, w = e.w;
			if(vis[v] == false && dis[v] > w)
				dis[v] = w;
		}
	}
}
int main()
{
	int f, t, w;
	cin >> n >> m;
	for(int i = 1; i <= m; ++i)
	{
		cin >> f >> t >> w;
		edge[f].push_back(Edge(t, w));
		edge[t].push_back(Edge(f, w));
		sumAll += w;
	}
	prim();
	cout << sumAll - sumTree;
	return 0;
}
解法2:Prim算法堆优化
#include<bits/stdc++.h>
using namespace std;
#define N 105
struct Edge
{
	int v, w;
	Edge(){}
	Edge(int a, int b):v(a),w(b){}
};
struct Pair
{
	int v, d;//v:顶点 d:顶点v到已选择顶点的距离
	Pair(){}
	Pair(int a, int b):v(a), d(b){}
	bool operator < (const Pair &b) const
	{
		return b.d < d;//到已选择顶点距离更小的数对更优先 
	}
};
vector<Edge> edge[N];//邻接表 
int n, m, sumTree, sumAll, dis[N];//dis[i]:顶点i到已经选择的顶点的最小距离 
bool vis[N];//vis[i]:顶点i是否已经被选择 
void prim()
{
	priority_queue<Pair> pq;
	memset(dis, 0x3f, sizeof(dis));
	dis[1] = 0;
	pq.push(Pair(1, 0));
	int visNum = 0;//已经访问的顶点数 
	while(pq.empty() == false)
	{
		int u = pq.top().v, d = pq.top().d;
		pq.pop();
		if(vis[u])
			continue;
		vis[u] = true;
		sumTree += d;//sumTree:最小生成树边权加和
		if(++visNum == n)
			break;
		for(Edge e : edge[u])
		{
			int v = e.v, w = e.w;
			if(vis[v] == false && dis[v] > w)
			{
				dis[v] = w;
				pq.push(Pair(v, dis[v]));
			}	
		}
	}
}
int main()
{
	int f, t, w;
	cin >> n >> m;
	for(int i = 1; i <= m; ++i)
	{
		cin >> f >> t >> w;
		edge[f].push_back(Edge(t, w));
		edge[t].push_back(Edge(f, w));
		sumAll += w;//sumAll:所有边权加和 
	}
	prim();
	cout << sumAll - sumTree;
	return 0;
}
解法3:Kruskal算法
#include<bits/stdc++.h>
using namespace std;
#define N 105
struct Edge
{
	int f, t, w;
	Edge(){}
	Edge(int a, int b, int c):f(a),t(b),w(c){}
};
int n, m, edgeNum, sumTree, sumAll, fa[N];
bool vis[N];
vector<Edge> edges;
bool cmp(Edge a, Edge b)
{
	return a.w < b.w;
}
void initFa()
{
	for(int i = 1; i <= n; ++i)
		fa[i] = i;
}
int find(int x)
{
	if(x == fa[x])
		return x;
	else
		return fa[x] = find(fa[x]);
}
void merge(int x, int y)
{
	fa[find(x)] = find(y);
}
void kruskal()
{
	sort(edges.begin(), edges.end(), cmp);
	for(Edge e : edges)
	{
		if(find(e.f) != find(e.t))
		{
			sumTree += e.w;
			merge(e.f, e.t);
			if(++edgeNum == n-1)
				return;
		}
	}
}
int main()
{
	int f, t, w;
	cin >> n >> m;
	for(int i = 1; i <= m; ++i)
	{
		cin >> f >> t >> w;
		edges.push_back(Edge(f, t, w));
		sumAll += w;
	}
	initFa();
	kruskal();
	cout << sumAll - sumTree;
	return 0;
}

到了这里,关于信息学奥赛一本通 1391:局域网(net)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 局域网禁止上网软件、局域网上网控制软件、局域网如何限制上网的方法

        有时候,我们处于某种电脑使用的管理,需要禁止电脑上网,防止电脑无节制的上网行为。或者我们需要控制电脑上网行为,限制电脑随意上网的行为,从而规范电脑使用,加强网络管理。     那么,局域网如何禁止电脑上网、如何控制电脑上网行为呢?笔者以为,

    2024年02月08日
    浏览(32)
  • 局域网网速分配软件、局域网如何分配网速、局域网网速控制软件的选择

        网速慢,似乎是当前企业网络管理中的一个顽疾。在企业上班族中,大家工作时间使用电脑时的一个共同体会就是:网速真慢。尤其是上班时间,网速慢会导致很多通过网络进行的工作无法正常开展,从而降低工作效率。     那么,单位局域网如何防止网速慢,怎样

    2024年02月08日
    浏览(38)
  • 局域网是什么 局域网的介绍

    局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,

    2024年02月05日
    浏览(67)
  • 信息学奥赛一本通习题答案(一)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址为http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来帮助 篇幅有限,所以从分支结构开始,所有代码都可以正确提交,鉴于本人能力有限以及教学需要,部分代

    2024年02月16日
    浏览(29)
  • 信息学奥赛一本通【1302】股票买卖

    信息学奥赛一本通1302 1302:股票买卖 时间限制: 1000 ms 内存限制: 65536 KB   【题目描述】 最近越来越多的人都投身股市,阿福也有点心动了。谨记着“股市有风险,入市需谨慎”,阿福决定先来研究一下简化版的股票买卖问题。 假设阿福已经准确预测出了某只股票在未来N天的

    2024年02月05日
    浏览(27)
  • 信息学奥赛一本通(1398:短信计费)

    1398:短信计费 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 22811     通过数: 10561 【题目描述】 用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字)。如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分

    2023年04月08日
    浏览(67)
  • 什么是局域网?局域网基础知识介绍

    局域网,英文名称Local Area Network,简称 LAN ,指的是在一个局部的地里范围内(一般在几千米以内),把计算机、打印机、应用软件、数据库、路由器、交换机等设备连接起来组成的计算机通信网络。局域网可以实现文件管理、打印机共享、扫描仪功效、内部通信、应用软件共享

    2024年02月08日
    浏览(28)
  • 局域网故障怎么排除 局域网故障排除方法介绍

    局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能,局域网故障怎么排除呢? 1.当整个网络都不通时,可能是交换机或集线器的问题,要看交换机或集线器是否在正常工作。 2.只有一台电脑网络不通,即打开这台电脑

    2024年02月06日
    浏览(32)
  • 如何创建局域网 创建临时局域网设置图文教程

     在公司开会的时候,想分享同一份资料;在玩游戏的时候,想大家一起玩,都可以用局域网来完成。创建局域网可能会很麻烦,但是如果创建临时局域网却十分简单。本次小编就为大家演示办法。 具体方法  第一步:打开“网络和共享中心”,方法有两个:右键点击任务栏

    2024年02月06日
    浏览(29)
  • 信息学奥赛一本通 1376:信使(msner)

    ybt 1376:信使(msner) 1. 图论:最短路径 每个哨所是一个顶点,哨所与哨所之间的通信线路为边,两哨所间通讯花费的时间为边的权值。 记第一个哨所为顶点s,信息从第一个哨所传递到表示为顶点x的某哨所可能有多条路径,每条传送路径有一个花费的时间,自然要选择花费时

    2024年02月14日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包