洛谷题单 -- 图论的简单入门

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

B3643 图的存储

链接 : 

图的存储 - 洛谷

思路 : 

这一题要考察图的存储方式 , 一般可以使用邻接矩阵 或 邻接表来存储 图的结点 和1 边的信息 ,详情请看代码 : 

代码

#include<bits/stdc++.h>
using namespace std;

const int N = 1010 ;
int n , m ;
int a[N][N] ; // 邻接矩阵 
vector<int> b[N]; // 邻接表 

// 邻接矩阵的输出 
void pa(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout << a[i][j] << " ";
		}
		cout << endl ;
	}
}

// 邻接表的输出 
void pb(){
	for(int i=1;i<=n;i++){
		int d = b[i].size();
		cout << d << " ";
		sort(b[i].begin(),b[i].end());
		for(int j=0;j<d;j++){
			cout << b[i][j] << " ";
		}
		cout << endl ;
	}
}

int main(){
	cin >> n >> m;
	for(int i=0;i<m;i++){
		int x , y ; cin >> x >> y ;
		a[x][y] = 1 ; a[y][x] = 1 ; // 邻接矩阵
		b[x].push_back(y) ; b[y].push_back(x) ; // 邻接表 
	}
	pa();
	pb();
	return 0 ;
}

P5318 【深基18.例3】查找文献

链接 

【深基18.例3】查找文献 - 洛谷

思路 : 

这题考察有向图的 dfs 和 bfs ,详情请看代码,如果用邻接矩阵的话一定会mle,只能够使用邻接表,我这里采用的是用vector数组实现的邻接表,详情请看代码 : 

代码 

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10 ;
typedef long long LL ;

int n , m , x , y;
bool b[N] ; // 状态记录数组 
vector<int> a[N] ; // 邻接表 
queue<int> q;

inline int read(){//二进制优化的快读 
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

// x指当前遍历到的结点,r表示已遍历过的结点 
void dfs(int x , int r){ 
	b[x] = true ;
	cout << x << " " ; // 输出
	if(r == n) return ;
	for(int i=0;i<a[x].size();i++){
		if(!b[a[x][i]])
			dfs(a[x][i],r+1);
	}
}

void bfs(int x){
	memset(b , false , sizeof(b)) ; // 清空bool数组
	b[x] = true ;
	q.push(x) ;
	while(!q.empty()){ // 还有没有没访问的 
		int v = q.front();
		q.pop() ; // 弹出队头 , 否则会一直在第一层遍历
		cout << v << " " ;
		for(int i=0;i<a[v].size();i++){
			if(!b[a[v][i]]){
				b[a[v][i]] = true ;
				q.push(a[v][i]);
			}
		} 
	}
}

int main(){
	// n = read() ; m = read() ;
	cin >> n >> m ;
	for(int i=1;i<=m;i++){
		x = read() ; y = read() ; 
		// cin >> x >> y ; 
		a[x].push_back(y);
	}
	for(int i=1;i<=n;i++) sort(a[i].begin(),a[i].end()); // 将每条路通向的点从小到大排序 
	dfs(1,0) ; // 深搜 
	puts("");
	for(int i=1;i<=n;i++) b[i] = false ;
	bfs(1) ; // 宽搜  
	puts("") ;
	return 0;
}

B3644 【模板】拓扑排序 / 家谱树

链接 :

 https://www.luogu.com.cn/problem/B3644

洛谷题单 -- 图论的简单入门,算法模板学习 &amp;&amp; 洛谷,算法学习,图论,算法

思路 : 

给出案例画图如下 : 

洛谷题单 -- 图论的简单入门,算法模板学习 &amp;&amp; 洛谷,算法学习,图论,算法

拓扑排序(模板题)

代码 : 

#include<bits/stdc++.h>
using namespace std;

const int N = 102 ;

vector<int> a[N] ;
int tp[N] ; // 存放拓扑序列 
int  d[N] ; // 存放每个结点的入度 
int n , x ;

bool toposort() {
	queue<int> q;
	int tt = 0 ;

	for(int i = 1; i <= n; i++) {
		if(d[i] == 0) {
			q.push(i); // 将入度为 0 的点全放进来 
		}
	}
	
	while(!q.empty()) {
		int u = q.front() ; q.pop();
		tp[++tt] = u ;
		for(auto v : a[u]) {
			d[v] -- ;
			if(d[v] == 0){
				q.push(v);
			}
		}
	}
	return tt == n;	
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		while(cin >> x){
			if(x == 0) break;
			a[i].push_back(x);
			d[x] ++;
		}
	}	
	
	if(toposort()) {
		for(int i=1;i<=n;i++){
			cout << tp[i] << " ";
		}
		cout << endl ;
	}
	else{
		return 0;
	}
	return 0 ;
}

或者说这样 : 

#include<bits/stdc++.h>
using namespace std;

const int N = 102 ;

vector<int> a[N] ;
int  d[N] ; // 存放每个结点的入度 
int n , x ;

bool toposort() {
	queue<int> q;
	vector<int> res;
	
	for(int i = 1; i <= n; i++) {
		if(d[i] == 0) {
			q.push(i); // 将入度为 0 的点全放进来 
		}
	}
	
	while(!q.empty()) {
		int u = q.front() ; q.pop();
		res.push_back(u);
		for(auto v : a[u]) {
			d[v] -- ;
			if(d[v] == 0){
				q.push(v);
			}
		}
	}
	if(res.size()==n) {
		for(auto x : res) cout << x << " ";
		return true;
	}else {
		return false;
	}
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		while(cin >> x){
			if(x == 0) break;
			a[i].push_back(x);
			d[x] ++;
		}
	}	
	
	if(toposort()) {
		return 0 ;
	}
	return 0 ;
}

P3916 图的遍历

链接 : 

图的遍历 - 洛谷

思路 : 

反向建边 + dfs : 文章来源地址https://www.toymoban.com/news/detail-850290.html

代码 : 

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10 ;
vector<int> g[N] ;
int n , m ;
int ans[N] ;
// 反向建图 + dfs
// 考虑较大的点能够法相到达那一些点 

void dfs(int i , int b){
	if(ans[i]) return  ;
	ans[i] = b ;
	for(int j=0;j<g[i].size();j++){
		dfs(g[i][j] , b) ;
	}
}

int main(){
	cin >> n >> m ;
	for(int i=0;i<m;i++){
		int x , y ; cin >> x >> y ;
		 g[y].push_back(x) ; // 反向建边 
	}
	for(int i=n;i;i--) dfs(i,i) ; // 对i进行dfs 
	for(int i=1;i<=n;i++){
		cout << ans[i] << " " ;
//		if(ans[i]) cout << ans[i] << endl ;
//		else cout << i << endl ;
	}  
	return 0;
}

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

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

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

相关文章

  • 洛谷题单 Part 8.2 最短路问题

    最短路算法一般在算法竞赛中有四种比较常见, F l o y d Floyd Fl oy d 算法, B e l l m a n − F o r d Bellman-Ford B e ll man − F or d 算法, D i j k s t r a Dijkstra D ijk s t r a 算法, S P F A SPFA SPF A 算法。 F l o y d Floyd Fl oy d 算法和 B e l l m a n − F o r d Bellman-Ford B e ll man − F or d 算法的时间复杂

    2024年02月09日
    浏览(52)
  • 洛谷-官方题单版【入门篇】

    题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用。 建议完成本题目后继续尝试 P1001、P1008。 另外强烈推荐新用户必读贴 题目描述 超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。 题目描述 输入一个小写字母,输出其对应的大写

    2024年02月02日
    浏览(72)
  • 简单图论的知识

    Floyd算法是一种求解多源最短路问题的算法。 在floyd中,图一般用邻接矩阵存储,边权可正可负,利用动态规划思想,逐步求解出任意两点之间的最短距离。 我们需要准备一个数组d[N][N][N],初始化无穷。 d[k][i][j]表示路径(除去起点和终点)中编号最大的点编号=k的情况下,点

    2024年04月13日
    浏览(61)
  • 算法题目题单+题解——图论

    本文为自己做的一部分图论题目,作为题单列出,持续更新。 题单由题目链接和题解两部分组成,题解部分提供简洁题意,代码仓库:Kaiser-Yang/OJProblems。 对于同一个一级标题下的题目,题目难度尽可能做到递增。 题目链接:Luogu P3547 [POI2013] CEN-Price List 题解: 题目链接:

    2024年02月19日
    浏览(38)
  • 聚类算法与图论的结合:社交网络中的社群发现

    社交网络是现代互联网的重要组成部分,它们为人们提供了一种高效的沟通和交流方式。社交网络中的社群发现是一种常见的数据挖掘任务,它旨在识别网络中的社群结构,以便更好地理解网络中的信息传播和社交行为。 社群发现是一种无监督的学习方法,它通过对网络中的

    2024年04月24日
    浏览(39)
  • 【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树

    ✅作者简介:热爱后端语言的大学生,CSDN内容合伙人 ✨精品专栏:C++面向对象 🔥系列专栏:算法百炼成神 本专栏收录的均为牛客网的算法题目,内含链表、双指针、递归、动态规划、基本数据结构等算法思想的具体运用。牛客网不仅有大量的经典算法题目,也有大厂的面

    2024年02月03日
    浏览(46)
  • C语言,洛谷题,压缩技术2.0

    题目如下:  这题用C语言实现有一些难度,要用到一个库函数,strcat(头文件是string.h),用于连接两个字符串数组,strcat(str,arr)就是将arr字符数组后面的\\0清除,再将arr字符拼接到str上。 题目指出,输入的是一个n*n大小的输入数据,可以先打印第一行后,计算第一行后,计

    2024年02月07日
    浏览(39)
  • 【题单】一个动态更新的洛谷综合题单

    洛谷试炼场的题目确实很具有代表性,但是近几年以来,又有许多经典题目出现在 OI 界中,这个大题单就是作为洛谷试炼场的扩展和补充。 目录 新版本食用指南 更新日志 题单 Part 0 试机题 Part 1 入门阶段 Part 2 基础算法 Part 3 搜索 Part 4 动态规划 Part 4.1-4.4 动态规划 Part 4.5-

    2024年02月19日
    浏览(34)
  • 图论的基本知识

    1.数据结构 图论是数学的一个分支,研究图(Graph)的结构、性质以及它们之间的关系。图是由节点(或顶点)和边组成的一种数据结构,用于表示对象之间的关系。以下是一些图论的基本概念: 图(Graph): 图由节点(顶点)和连接节点的边组成。图可以分为有向图和无向

    2024年02月04日
    浏览(53)
  • PTA图论的搜索题

    目录 7-1 列出连通集 题目 输入格式: 输出格式: 输入样例: 输出样例: AC代码 7-2 六度空间 题目 输入格式: 输出格式: 输入样例: 输出样例: 思路 AC代码 7-3 地下迷宫探索 题目 输入格式: 输出格式: 输入样例1: 输出样例1: 输入样例2: 输出样例2: 思路 AC代码 7-4 社交网络图中结点的“

    2024年04月23日
    浏览(69)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包