MYOJ_7456:输出邻接点的数量(图论概念及基础运用)

ops/2025/3/5 2:17:13/
题目描述

给定一个无向图,n个顶点m条边。进行q次询问,每次询问一个顶点的邻接点的数量。
顶点编号为1,2,...,n。 

输入

第一行:两个整数n m,空格分开,n表示顶点数,m表示边数(1<=n<=100, 1<=m<=1000)
以下m行,每行两个整数f,t,表明从顶点f到顶点t有一条边
第m+2行:一个整数q,表示询问次数
以下q行,每行一个整数v,表示要询问顶点v的邻接点 

输出 

q行,每行为要询问的顶点的邻接点数量。

样例输入输出

输入:

4 5
1 2
1 3
1 4
2 3
3 4
2
1

输出:

3
2

方法一:邻接矩阵 

邻接矩阵就声明一个二维数组来保存是否有连接边,由于是无向图所以若存在边(i, j) 则edge[i][j] = 1且edge[j][i] = 1,否则为0

邻接矩阵是最好写的,话不多说开始分析~

STEP 1:输入n,m,输入m组f,t,在邻接矩阵中设置下标为f,t和t,f为1

STEP 2:输入q及q个询问,每次邻接点归零,输入V,n次循环,edge[v][z](z是循环次数)是1就说明是临接点,sum++

#include<bits/stdc++.h>
using namespace std;
int n,m,q,v,sum,edge[105][105];
int main() 
{cin>>n>>m;for(int i=1;i<=m;i++){int f,t;cin>>f>>t;edge[f][t]=edge[t][f]=1;}cin>>q;while(q--){cin>>v;sum=0;for(int z=1;z<=n;z++){if(edge[v][z]){sum++;}}cout<<sum<<'\n';}
}

 

方法2:链式前向星

这个比较难,咱会将的稍微详细一点~

先举个栗子

如果有下图

辣么他的邻接表就可以是下图

链式前向星是邻接表的一种,类似于链式存储结构,所以我们可以声明结点池

struct Edge
{int to;//通过这条边到达的顶点编号int next;//边链表下一个结点的地址
}edge[M];//结点池 最多有M条边
int p;//结点池指针
int head[N];//头结点数组 最多N个顶点

链式前向星必须插入,而且只能使用头插(尾插你取不到地址的)

先申请新节点,先把to值设成v(具体参照代码),再把下一个结点的地址设成第u个头结点,最后第u个头结点地址变为np,完成

void addEdge(int u, int v)
{int np = ++p;edge[np].to = v;edge[np].next = head[u];head[u] = np;
}

在主函数中插入就跟邻接矩阵差不多了,请参见完整代码第21~22行

总体思路:

STEP 1:声明结点池

STEP 2:声明插入函数(这两步参照上面解析)

STEP 3:输入,每次调用两次头插

STEP 4:输入q及q个询问,每次邻接点z归零,输入u,遍历头节点数组,每次z++,完成遍历后输出

#include<bits/stdc++.h>
using namespace std;
struct Edge
{int to,next;
}edge[1005];
int p,head[105],n,m,f,t,q,u,z;
void addEdge(int u,int v)
{int np=++p;edge[np].to=v;edge[np].next=head[u];head[u]=np;
}
int main() 
{cin>>n>>m;for(int i=1;i<=m;i++){cin>>f>>t;addEdge(f,t);addEdge(t,f);}cin>>q;while(q--){z=0;cin>>u;for(int i=head[u];i!=0;i=edge[i].next){z++;}cout<<z<<'\n';}
}

 方法3:vector邻接表

这个也好理解,咱就直接说步骤哩~

其实身为天字第x号大懒人,就直接在链式前向星基础上修改就行

STEP 1:输入n,m,输入m组f,t,在vector邻接表中分别插入:第f个插入t,第t个插入f

STEP 2:输入q及q个询问,输入u,输出第u个邻接表的长度就行

#include<bits/stdc++.h>
using namespace std;
int n,m,f,t,q,u;
vector<int>edge[105];
int main() 
{cin>>n>>m;for(int i=1;i<=m;i++){cin>>f>>t;edge[f].push_back(t);edge[t].push_back(f);}cin>>q;while(q--){cin>>u;cout<<edge[u].size()<<'\n';}
}

 


http://www.ppmy.cn/ops/163183.html

相关文章

实战-使用 Playbook 批量部署多台 LAMP 环境

实战-使用 Playbook 批量部署多台 LAMP 环境 playbooks 使用步骤 playbook 是一个不同于使用 ansible 命令行执行方式的模式&#xff0c;功能更强大更灵活。 1、在 playbooks 中定义任务&#xff1a; - name&#xff1a; task description #任务描述信息 module_name: modul…

微前端开发模式解析与实践

微前端&#xff08;Micro Frontends&#xff09;是一种将前端应用拆分为多个独立模块的开发模式&#xff0c;允许不同团队独立开发、部署和维护各自的模块&#xff0c;最终组合成一个完整的应用。以下是关于微前端开发的详细解析&#xff1a; 一、微前端的核心思想 独立开发 每…

服务流程设计和服务或端口重定向及其websocket等应用示例

服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…

Logstash:数据搬运工的奇幻漂流

Logstash&#xff1a;数据搬运工的奇幻漂流 1. 什么是 Logstash&#xff1f; 想象一下&#xff0c;你的系统每天都在疯狂地产生日志&#xff0c;像一个话痨一样滔滔不绝。而你要从这些海量数据中找出有用的信息&#xff0c;比如监控系统异常、分析用户行为等等。这时候&#…

【动态规划学习】区间dp

区间dp概述 区间dp&#xff0c;就是在一段区间上进行动态规划&#xff0c;求解一段区间的最优解。最后合并小区间上的最优解从而得到全局最优解的算法。 【问题引入】 石子合并问题 N堆石子摆成一条线。现要将石子有次序地合并成一堆。规定每次只能选相邻的两堆石子合并成新的…

Linux文档编辑相关命令详解

Linux文档编辑相关命令 1. grep grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。 1.1 语法 grep [options] pattern [files] 1.2 常用选项 -i&#xff1a;忽略大小写进行匹配。-v&#xff1a;反向查找&#xff0c;只打印不匹配的行。-…

【愚公系列】《Python网络爬虫从入门到精通》040-Matplotlib 概述

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

基于专利合作地址匹配的数据构建区域协同矩阵

文章目录 地区地址提取完成的处理代码 在专利合作申请表中&#xff0c;有多家公司合作申请。在专利权人地址中&#xff0c; 有多个公司的地址信息。故想利用这里多个地址。想用这里的地址来代表区域之间的专利合作情况代表区域之间的协同、协作情况。 下图是专利合作表的一部分…