第九周:图论

这篇具有很好参考价值的文章主要介绍了第九周:图论。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

主要涉及链式前向星,dijkstra算法,Floyd算法,及其相应摸版。

目录

第一题:查找文献

思路:

代码:

第二题:Floyd

思路:

代码:

 第三题:单源最短路径

思路:

代码:


第一题:查找文献

P5318 【深基18.例3】查找文献 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

第九周:图论,算法,图论,数据结构

 

思路:

这个主要考察单边遍历问题,涉及到BFS和DFS的利用,可以采用vector存图来简化空间复杂度,同时注意记得排序。

代码:

#include<bits/stdc++.h>
using namespace std;
const int M = 1e6 + 5;
vector< int >f[M];
queue<int>Q;
bool vis[M];//全局变量一开始全部为0
void dfs(int x)
{
	cout << x << " ";
	for (int i = 0; i < f[x].size(); i++)
	{
		int next = f[x][i];
		if (!vis[next])
		{
			vis[next] = true;
			dfs(next);
		}
	}
}
int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < m; i++)
	{
		int x, y;
		cin >> x >> y;
		f[x].push_back(y);
	}
	for (int i = 0; i < m; i++)
	{
		sort(f[i].begin(), f[i].end());
	}
	vis[1] = 1;
	dfs(1);
	cout << endl;
	memset(vis, 0, sizeof(vis));//重新初始化
	Q.push(1); vis[1] = 1;//bfs
	while (!Q.empty())
	{
		int X = Q.front(); Q.pop();
		cout << X << " ";
		for (int i = 0; i < f[X].size(); i++)
		{
			int next = f[X][i];
			if (!vis[next])
			{
				vis[next]=1;
				Q.push(next);
			}
		}
	}
	return 0;
}

第二题:Floyd

U80592 【模板】floyd - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

第九周:图论,算法,图论,数据结构

思路:

这就是一道简单的模板题,可以采用滚动数组优化一下空间复杂度,如果理解不了就记模板就可以了。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll INF = 1e9 + 10, MOD = 998244354,M=505;
ll f[M][M];
int main()
{
	int n, m;
	cin >> n >> m;
	/*memset(f, INF, sizeof(f));不建议使用,其实和遍历时间复杂度一样*/
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++) {
			if (i == j)f[i][j] == 0;
			else
			{
				f[i][j] = INF;//赋初值
			}
			
		}
	}
	 
	for (int i = 1; i <= m; i++)
	{
		ll x, y, l;
		cin >> x >> y >> l;
		f[x][y] = min(l,f[x][y]);
		f[y][x] = min(l, f[y][x]);//有重复的路径但是路程不同取最短路程
	}

	for (int k = 1; k <= n; k++)
	{
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= n; j++)
			{
				f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		ll sum = 0;
		for (int j = 1; j <= n; j++) {
			sum = (sum + f[i][j]) % MOD;
		}
		cout << sum << endl;
	}
	return 0;
}

 第三题:单源最短路径

P4779 【模板】单源最短路径(标准版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

第九周:图论,算法,图论,数据结构

思路:

主要考察链式前向星和Dijkstra的模板,没有什么难度

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 50, INF = 1e9 + 1000,maxm=5e5+50;
struct edge
{
	int next;//同一个起点的上一个点
	int to;//终点
	int dis;//权值
};
edge e[maxm];
int ans[maxn];
bool vis[maxn];
int head[maxn],tot;
inline void add_edge(int st, int ed, int dis)//链式前向星的模板
{
	e[++tot].dis = dis;
	e[tot].to = ed;
	e[tot].next = head[st];
	head[st] = tot;
}
struct node
{
	int now;
	int dis;
	bool operator < (const node& x)const
	{
		return x.dis < dis;
	}
};
priority_queue<node>Q;//由小到大
int main()
{
	int n, m, s;
	cin >> n >> m >> s;
	for (int i = 1; i <= n; i++)ans[i] = INF;
	ans[s] = 0;
	for (int i = 0; i < m; i++)
	{
		int u, v, w;
		cin >> u >> v >> w;
		add_edge(u, v, w);
	}
	Q.push({ s,0 });
	while (!Q.empty())//dijkstra模板
	{
		auto X = Q.top();
		Q.pop();
		int now = X.now;
		if (vis[now])continue;
		vis[now] = 1;
		for (int i = head[now]; i; i = e[i].next)//链式前向星遍历模板
		{
			int Y = e[i].to;
			if (ans[Y] > ans[now] + e[i].dis)
			{
				ans[Y] = ans[now] + e[i].dis;
				if (!vis[Y])
				{
					Q.push({ Y, ans[Y] });
				}
			}
		}
	}
	for (int i = 1; i <= n; i++)
	{
		cout << ans[i] << " ";
	}
	return 0;
}

 文章来源地址https://www.toymoban.com/news/detail-636069.html

到了这里,关于第九周:图论的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构的应用场景:如社交网络、路由算法、图论、网络协议等

    作者:禅与计算机程序设计艺术 数据结构(Data Structure)是计算机科学中存储、组织、管理数据的方式,主要用于解决信息检索、处理和运算时的效率及空间占用问题。它是指数据元素(elements)之间的关系、顺序和逻辑结构,以及相互作用的算法。数据结构通常采用抽象数据类

    2024年02月14日
    浏览(46)
  • 数据结构第九章

    (1)顺序表的查找          1)顺序表查找的结构 顺序查找的过程:从表中最后一个记录开始,逐个进行记录的和给定值的比较。(也就是说,在查找到时候从最后一个元素开始查找,在这个表中位置为0的位置空着,留给你要查找的元素) 在顺序表的查找中,需要

    2024年01月21日
    浏览(41)
  • 数据结构第九弹---循环队列

    顺序队列在使用过程中容易出现虚假的满状态, 为了解决这个问题,就产生了一个较巧妙的方法,将顺序队列臆造为一个环状的空间,称之为循环队列。循环队列中指针和队列元素之间的关系不变,我们只需要利用模运算就可以很容易实现指针的循环移动。但是循环队列中存

    2024年01月16日
    浏览(39)
  • NeuDs 数据结构 图论

    在一个有权无向图中,若 b 到 a 的最短路径距离是12,且 c 到 b 之间存在一条权为2的边,则 c 到 a 的最短路径距离一定不小于10。 T 解析: 我们首先来分析b-a有几种可能,首先是b到a有直接的路径,其次b通过其他的结点到达a点。 如果是b通过c点到达a点我们就可以知道,min{

    2024年02月08日
    浏览(41)
  • 【数据结构】实验六:图论

    采用邻接矩阵表示法创建无向图G ,依次输出各顶点的度。 输入格式: 输入第一行中给出2个整数i(0i≤10),j(j≥0),分别为图G的顶点数和边数。 输入第二行为顶点的信息,每个顶点只能用一个字符表示。 依次输入j行,每行输入一条边依附的顶点。 输出格式: 依次输出各顶点的

    2024年02月05日
    浏览(45)
  • 【图论基础数据结构及其应用】

    本文主要介绍Java中图论基础数据结构的基本原理、实现方式以及使用场景。图论是研究非线性方程组及其解的数学领域,广泛应用于计算机科学中,如网络拓扑、交通网络、地理信息系统等。 图是由节点(Vertex)和边(Edge)组成的数据结构。节点表示图中的对象或实体,而

    2024年02月12日
    浏览(48)
  • 图论-图的基本概念与数据结构

    无向图 边是没有方向的,也就是双向的 结点 V = { v 1 , v 2 , . . . , v 7 } mathcal{V} = { v_1,v_2,...,v_7} V = { v 1 ​ , v 2 ​ , ... , v 7 ​ } 边 ε = { e 1 , 2 , e 1 , 3 , . . . , e 6 , 7 } varepsilon = {e_{1,2},e_{1,3},...,e_{6,7}} ε = { e 1 , 2 ​ , e 1 , 3 ​ , ... , e 6 , 7 ​ } 图 G = { V , ε } mathcal{G} = { math

    2024年02月08日
    浏览(46)
  • SYSU程设c++(第九周)函数对象、友元函数、友元类

    函数对象:         如果一个类 定义了operator()运算符函数 ,则 可以使用该类的对象名为函数名 调用这个函数.          函数对象是一个对象, 但 调用形式和普通函数调用一样 ,因此取名叫函数对象 (注意operator()先有个括号,接着才是括号(参数列表)) 友元函数:  f

    2023年04月23日
    浏览(32)
  • 期末复习(3)C语言数据结构_图论基础

    目录 导言:  定义: 一、边和度的概念: 1.1 无向图中的边和度: 1.2 有向图中的边和度: 1.3 度序列和握手定理: 二、弧和度的关系: 2.1 有向图中的弧和度: 2.2 度序列和握手定理在有向图中的应用: 2.3 邻接矩阵和邻接表在有向图中的表示: 2.4 强连通图: 三、完全图:

    2024年02月03日
    浏览(41)
  • 搜索与图论第五期 拓扑序列

    拓扑排序 拓扑排序是一种对有向无环图(Directed Acyclic Graph,简称DAG)进行的排序过程,目的是将图中所有的顶点按照发生事件的顺序排成一条线性序列。这种排序确保了图中任意两个相邻顶点之间至少有一条边相连,且在这条边的方向上,这条边的终点在前于起点。拓扑排

    2024年01月23日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包