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

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

思路 : 

给出案例画图如下 : 

拓扑排序(模板题)

代码 : 

#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 : 

代码 : 

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/614635.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未佩戴厨师帽识别检测 厨房管理系统 自动监测未佩戴厨师帽行为 实时报警

在厨房环境中&#xff0c;佩戴厨师帽对于食品安全和卫生至关重要。厨师帽能够有效地防止头发、皮屑等杂质掉入食物中&#xff0c;减少了食品受到污染的可能性&#xff0c;从而保障了食品安全。特别是在学校、餐厅等场景中&#xff0c;对于未佩戴厨师帽的检测更是必不可少。相关…

elementui中el-select下拉列表偏移问题

问题截图 解决方法 在el-select中添加:popper-append-to-body"false"即可 加完后的效果

kanzi API案例

背景&#xff1a;kanzi的帮助文档都是api简单含义&#xff0c;很少有案例的说明。每一次使用API都是一个摸索的过程。记录一下用到的API案例。 1. 按钮事件 界面有一个按钮&#xff0c;点击后C处理对应的事件 void MyKanzi::onProjectLoaded() { Button2DSharedPtr button2D_…

IP地址修改步骤详解

IP地址是网络设备在网络中的标识&#xff0c;它决定了设备在网络中的位置与可访问性。然而&#xff0c;在某些情况下&#xff0c;我们可能需要修改IP地址&#xff0c;以满足特定的网络需求或解决网络问题。虎观代理将详细介绍IP地址的修改步骤&#xff0c;帮助读者更好地理解和…

python爬虫-------urllib代理和代理池(第十七天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

MongoDB爬虫:(某扑)实战

https://bbs.hupu.com/bxj网页地址: https://bbs.hupu.com/bxj 然后我们在网页上定义帖子名称、帖子链接、创建时间、回复数、最后回复用户...... 除此之外,我们发现虎扑步行街最多显示的页数(20): 、 当我们打开第3页的时候,网页的URL的地址变为了:https://bbs.hupu.…

python入门(一)配置环境和选择IDE

Python&#xff0c;作为一种简洁易懂的编程语言&#xff0c;近年来在全球范围内受到了广泛的关注和追捧。它不仅语法简单明了&#xff0c;易于上手&#xff0c;而且拥有强大的第三方库和广泛的应用领域。从数据分析、机器学习到Web开发&#xff0c;Python都能发挥出色的性能&am…

MySQL-进阶篇-基础架构:一条sql语句是如何执行的

摘自&#xff1a;01 | 基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f;-MySQL实战45讲-极客时间 视频讲解&#xff1a;7分钟精通MySql中SQL执行原理_哔哩哔哩_bilibili 可结合学习&#xff0c;本文仅记录SQL语句的执行流程&#xff0c;以上内容有一些额外知识未…

自动化测试selenium(2)

目录 WebDriver介绍 WebDriver使用 使用WebDriver驱动操作浏览器(打开一个百度) WebDriver 相关API 定位元素 操作元素 上一篇主要介绍了自动化测试的概念以及selenium的基本原理, 这里我们来讲一下如何利用selenium来写测试用的脚本. WebDriver介绍 Selenium是一个用于…

JetBrains PhpStorm 2024.1 发布 - 高效智能的 PHP IDE

JetBrains PhpStorm 2024.1 发布 - 高效智能的 PHP IDE 请访问原文链接&#xff1a;JetBrains PhpStorm 2024.1 (macOS, Linux, Windows) - 高效智能的 PHP IDE&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org JetBrains PhpSt…

算法—分治

分而治之:指的是当主问题可以被分解为一个相同次级问题加相同基本问题时&#xff0c;采用这种思想&#xff0c;基本问题指问题规模最小时的情况&#xff0c;次级问题是指主问题的n级降低n-1级的问题。 具体实现&#xff1a;多数采用递归操作分解&#xff0c;然后递归操作&#…

Harmony鸿蒙南向外设驱动开发-Audio

Audio驱动概述 多媒体系统是物联网设备开发中不可缺少的一部分&#xff0c;Audio作为其中重要的一个模块&#xff0c;Audio驱动模型的构建显得尤为重要。 本文主要介绍基于HDF&#xff08;Hardware Driver Foundation&#xff09;驱动框架开发的Audio驱动&#xff0c;包括Aud…