求有向图中某顶点的入度

问题描述

创建一个有向图结构,求某顶点的入度。要求有向图的顶点个数,边的条数,顶点的数据,各条边都由键盘读入,顶点的数据类型为字符型。
输入描述
第一行输入有向图的顶点数和边的条数,以空格隔开
第二行输入每个顶点的数据,中间没有空格
第三行输入每条边,每条边的格式为i j,中间有空格,所有边占一行
第四行输入某个顶点的序号
输出描述
输出要求顶点的出度,占一行
输入样例
5 5
abcde
0 1 0 2 0 3 1 2 1 4
2
输出样例
2

问题分析

有向图,所以在输入边的时候,只能将由x->y的边置为1(存在)

代码


#include<iostream>
using namespace std;
const int MaxSize = 20;
class Text
{
	public:
		Text(int v,int e);
		void Initialize();						
		void calculateInter(int v);				//计算入度 
		void CalculateOuter(int v);				//计算出度 
		int CountInter;							//入度数 
		int CountOuter; 						//出度数 
	private:
		char vertex[MaxSize];
		int edge[MaxSize][MaxSize];
		int vertexNum,edgeNum; 
		int visited[MaxSize];
};

Text::Text(int v, int e)
{
	CountInter = 0;
	CountOuter = 0;
	vertexNum = v,edgeNum = e;
	
	int i,j,x,y;
	for(i = 0; i < vertexNum; i++)
	{
		cin >> vertex[i];
		visited[i] =0;
	}
	
	for (x = 0; x < vertexNum; x++)				//边初始化为全没有 
	{
		for(y = 0; y < vertexNum; y++)
		{
			edge[x][y] = 0;
		}
	}
	
	for(j = 0; j < edgeNum; j++)				//因为是有向图,所以单向存在 
	{
		cin >> x >> y;
		edge[x][y] = 1;
	}
}

void Text::Initialize()
{
	for(int y = 0; y < vertexNum; y++)
	{
		visited[y] = 0;
	}
}
void Text::CalculateOuter(int v)
{
	for(int x = 0; x < vertexNum; x++)
	{
		if(edge[x][v] == 1)
		{
			CountOuter++;
		}
	}
}
void Text::calculateInter(int v)
{
	for(int y = 0; y < vertexNum; y++)
	{
		if(edge[v][y] == 1)
		{
			CountInter++;
		}
	}
}

int main()
{
	int v,e;
	cin >> v >> e;
	
	Text T(v,e);
	
	int n;
	cin >> n;
	
	T.CalculateOuter(n);
	cout << T.CountOuter << endl;				//输出某顶点的出度 
	return 0; 
}
<think>好的,我现在需要回答用户关于无向顶点的定义和计算方法的问题。首先,我得确认用户的问题核心在哪里。用户提到“无向顶点”,而根据论的基础知识,无向其实是没有和出之分的,因为边是双向的。不过用户可能之前学过有向图的相关概念,所以产生了这个疑问。 接下来,我需要回忆无向的基本定义。在无向中,边没有方向,连接两个顶点的边是双向的。因此,每个顶点(degree)指的是与该顶点相连的边的数量。例如,顶点v的就是有多少条边与v相连。这时候,用户可能混淆了有向图中的/出和无向。 然后,参考用户提供的引用内容,特别是引用[3]中的代码部分,虽然代码处理的是邻接矩阵存储的无向,但在计算时却分别计算了和出。这可能引起用户的困惑,因为对于无向来说,邻接矩阵是对称的,每个顶点和出实际上等于它的,因此计算和出在无向中是多余的,可能代码示例中存在错误或者特殊情况? 不过,用户的问题明确提到无向,所以需要解释清楚这个概念是否适用。根据论的标准定义,无向中没有的概念,只有。因此,正确的回答应该是说明这一点,并解释是如何计算的。 同时,用户提供的引用[2]提到无向的割点和割边,这可能与顶点相关,例如割点的可能较高,但这可能不是直接相关的信息。引用[1]涉及概率无向模型,可能与当前问题关系不大,但需要注意是否有相关概念需要提及。 现在需要组织语言,明确告诉用户无向没有,只有的概念,并说明的计算方法,例如邻接矩阵或邻接表下的计算方式。同时,可能需要指出用户提供的引用[3]中的代码在处理无向时计算和出是错误的,或者可能该代码实际上是处理有向图的,存在误解。例如,代码中的addEdge函数只单向添加边,这在无向中是不正确的,应该同时设置graph[u][v]和graph[v][u]为1。这可能是一个代码错误,导致用户混淆。 最后,生成相关问题,可能涉及的应用、无向有向图的区别、邻接矩阵的正确使用方法等。</think>在无向中,顶点的****这一概念并不适用。因为无向的边没有方向性,所有边都是双向连接的,所以只有****(degree)的定义。以下为详细说明: --- ### **无向顶点(Degree)** 1. **定义** 顶点是指与该顶点直接相连的边的数量。例如,若顶点$v$与3条边相连,则其为3。 2. **计算方法** - **邻接矩阵存储** 在邻接矩阵中,顶点$i$的等于矩阵中第$i$行(或第$i$列,因矩阵对称)所有非零元素的总和。 例如,若邻接矩阵为: $$ \begin{bmatrix} 0 & 1 & 1 \\ 1 & 0 & 0 \\ 1 & 0 & 0 \\ \end{bmatrix} $$ 则顶点1的为2(对应第1行有2个1),顶点2和3的均为1。 - **邻接表存储** 顶点等于其邻接链表中包含的节点数量。例如,若顶点$v$的邻接链表为`[u, w]`,则其为2。 3. **与有向图的区别** 有向图顶点(in-degree)和出(out-degree)分别表示指向该顶点的边数和从该顶点出发的边数。但在无向中,每条边会被两个顶点同时计,因此无需区分和出[^3]。 --- ### **代码示例中的问题** 您提供的引用[3]中代码可能存在问题: ```cpp void addEdge(ll u, ll v) { graph[u][v] = 1; // 仅单向设置边 } ``` 对于无向,邻接矩阵应满足对称性,即需同时设置`graph[u][v] = 1`和`graph[v][u] = 1`。当前代码仅处理了单向边,导致和出计算结果错误。无向的邻接矩阵应为对称矩阵,因此顶点$i$的等于其行或列的非零元素总和。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值