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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

房屋鉴定研究院报告系统

一、项目背景与意义 随着城市化进程的加速和房地产市场的蓬勃发展&#xff0c;房屋安全问题日益受到社会各界的广泛关注。房屋鉴定作为确保房屋安全的重要手段&#xff0c;对于保障人民群众生命财产安全、维护社会稳定具有重要意义。然而&#xff0c;传统的房屋鉴定方式存在诸…

Harmony鸿蒙南向驱动开发-SDIO接口使用

功能简介 SDIO是安全数字输入输出接口&#xff08;Secure Digital Input and Output&#xff09;的缩写&#xff0c;是从SD内存卡接口的基础上演化出来的一种外设接口。SDIO接口兼容以前的SD卡&#xff0c;并且可以连接支持SDIO接口的其他设备。 SDIO接口定义了操作SDIO的通用…

VRRP——虚拟路由冗余协议

什么是VRRP 虚拟路由冗余协议VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种用于提高网络可靠性的容错协议。 通过VRRP&#xff0c;可以在主机的下一跳设备出现故障时&#xff0c;及时将业务切换到备份设备&#xff0c;从而保障网络通信的连续性和可…

kafka快速入门+应用

Kafka, 构建TB级异步消息系统 1.快速入门 1.1 阻塞队列 在生产线程 和 消费线程 之间起到了 &#xff0c; 缓冲作用&#xff0c;即避免CPU 资源被浪费掉 BlockingQueue 解决 线程通信 的问题阻塞方法 put 、 take生产者、消费者 模式 生产者&#xff1a;产生数据的线程…

ffmpeg命令与批处理编程

(一) CMD脚本查找所有文件 powershell与cmd转换 powershell与cmd虽然同为windows命令&#xff0c;但许多命令并不通用。 CMD换行符 a 在CMD下&#xff0c;可以用^作为换行符&#xff0c;类似于Linux下的\。举例如下&#xff1a; start pemu.exe ^ -net nic,vlan1,macaddr…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第三套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第三套 (共9套&#xff0c;有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09; 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadidadidida313&#xff0c;加我备注&#x…

docker 上达梦导入dump文件报错:本地编码:PG GBK,导入女件编码:PGGB18030

解决方案&#xff1a; 第一步进入达梦数据容器内部 docker exec -it fc316f88caff /bin/bash 第二步&#xff1a;在容器中 /opt/dmdbms/bin目录下 执行命令 cd /opt/dmdbms/bin./dimp USERIDSYSDBA/SYSDBA001 FILE/opt/dmdbms/ZFJG_LJ20240407.dmp SCHEMASZFJG_LJUSERIDSYSD…

顶顶通呼叫中心中间件-回铃音补偿(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-回铃音补偿(mod_cti基于FreeSWITCH) 回铃音的用处 回铃音&#xff1a; 当别人打电话给你时&#xff0c;你的电话响铃了&#xff0c;而他听到的声音叫做回铃音。回铃音是被叫方向主叫方传送&#xff0c;也是彩铃功能的基础。我们平时打电话听到的“嘟 嘟…

html 引入vue Element ui 的方式

第一种&#xff1a;使用CDN的方式引入 <!--引入 element-ui 的样式&#xff0c;--> <link rel"stylesheet" href"https://unpkg.com/element-ui/lib/theme-chalk/index.css"> <!-- 必须先引入vue&#xff0c; 后使用element-ui --> <…

MyBatis 中的动态 SQL 的相关使用方法

为什么会有动态SQL&#xff0c;把SQL写死不是比较方便吗&#xff1f;其实有很多的举例&#xff0c;这里我那一个常见的来说&#xff0c;像我们用户注册&#xff0c;会有必填字段和非必填字段&#xff0c;有些传来的参数不一样&#xff0c;那对应的SQL也不一样&#xff0c;因此&…

微信小程序 uniapp+vue动漫交流系统 java(springboot+ssm)/python(flask+django)/

小程序Android端运行软件 微信开发者工具/hbuiderx uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 前端&#xff1a;HTML5,CSS3 VUE 后端&#xff1a;java(springbootssm)/python(flaskdja…

数字化社交的引擎:解析Facebook的影响力

随着数字技术的飞速发展&#xff0c;社交网络已成为人们日常生活中不可或缺的一部分。而在这个数字化社交的世界中&#xff0c;Facebook作为最具影响力和知名度的平台之一&#xff0c;其所扮演的角色越发重要。本文将深入解析Facebook在数字化社交领域的影响力&#xff0c;并探…

独一无二:探索单例模式在现代编程中的奥秘与实践

设计模式在软件开发中扮演着至关重要的角色&#xff0c;它们是解决特定问题的经典方法。在众多设计模式中&#xff0c;单例模式因其独特的应用场景和简洁的实现而广受欢迎。本文将从多个角度详细介绍单例模式&#xff0c;帮助你理解它的定义、实现、应用以及潜在的限制。 1. 什…

VRRP(虚拟路由冗余协议)详解

VRRP-------虚拟路由冗余协议 在一个网络中&#xff0c;要做为一个合格的网络首先就要具备几种冗余&#xff0c;增加网络的可靠性。 这几种冗余分别为&#xff1a;线路冗余&#xff0c;设备冗余&#xff0c;网关冗余&#xff0c;UPS冗余 VRRP该协议就是解决网关冗余的。在二层…

【opencv】示例-imgcodecs_jpeg.cpp使用OpenCV库来创建和处理图像,并保存为不同JPEG采样因子的版本...

上层-原始图像 下层&#xff1a;编码解码后的lossy_img #include <opencv2/core.hpp> // 包含OpenCV核心功能的头文件 #include <opencv2/imgproc.hpp> // 包含OpenCV图像处理功能的头文件 #include <opencv2/imgcodecs.hpp> // 包含OpenCV图像编码解码功能…

滑动门Tab中使用Swiper造成动画不再循环了

路走的多了&#xff0c;坑也多。百度用的多了&#xff0c;就懒得用脑了。 这次案例是swiper效果&#xff0c;swiper官网或者通常的做法是&#xff0c;页面一加载就开始渲染swiper了&#xff0c;当然这个只需要傻傻的复制就行。 但是在滑动门Tab中的内容&#xff0c;还是按照之…

Linux下mysql的彻底卸载

Linux下mysql的彻底卸载 1、查看mysql的安装情况2、删除上图安装的软件3、都删除成功之后&#xff0c;查找相关的mysql的文件4、删除全部文件5、再次执行命令 1、查看mysql的安装情况 rpm -qa | grep -i mysql2、删除上图安装的软件 rpm -ev mysql-community-libs-5.7.27-1.e…

4.Labview簇、变体与类(上)

在Labview中&#xff0c;何为簇与变体&#xff0c;何为类&#xff1f;应该如何理解&#xff1f;具体有什么应用场景&#xff1f; 本文基于Labview软件&#xff0c;独到的讲解了簇与变体与类函数的使用方法和场景&#xff0c;从理论上讲解其数据流的底层概念&#xff0c;从实践上…

服务器数据恢复—不同型号服务器RAID5数据恢复策略有何不同?

RAID5作为应用最广泛的raid阵列级别之一&#xff0c;在不同型号服务器中的RAID5出现故障后&#xff0c;处理方法也不同。 RAID5阵列级别是无独立校验磁盘的奇偶校验磁盘阵列&#xff0c;采用数据分块和独立存取技术&#xff0c;能在同一磁盘上并行处理多个访问请求&#xff0c;…

取出/var/log/secure中一小时内登录失败超过三次的IP

取出/var/log/secure中一小时内登录失败超过三次的IP 前两个字段是日期&#xff0c;第三个字段是小时&#xff0c;第四个字段是IP cat /var/log/secure | sort -i | awk -F [ :] /Failed/{a[$1" "$2" "$3" "$4" "$(NF-3)]}END{for(i …