给定任意非空有向图 G,输出 G 中所有 K 顶点的算法,并返回 K 顶点的个数。

已知优先图 G 采用邻接矩阵存储是,其定义如下

typedef struct {                    // 图的定义
    int numVertices, numEdges;      // 图中实际的顶点数和边数
    char VerticesList[MAXV];        // 顶点表,MAXV为已定义常量
    int Edge[MAXV][MAXV];           // 邻接矩阵
}MGraph;

将图中出度大于入度的顶点成为 K 顶点,如图,a 和 b 都是 k 顶点,

设计算法 int printVertices(MGraph G)对给定任意非空有向图 G,输出 G 中所有 K 顶点的算法,并返回 K 顶点的个数。

(1)给出算法的设计思想。

(2)根据算法思想,写出 C/C++描述,并注释。

思想:邻接矩阵表示的有向图,一行中1的格式是该行对应顶点的出度个数,一列中1的个数是该列对应的顶点的入度个数。开始时,count=0,来统计k结点的个数,对图中的每个结点,根据邻接矩阵来计算出度和入度的个数,若出度大于入度,则为k结点。

代码:

int printVertices(MGraph G){
	int intdegree,outdegree,k,m,count=0;
	for(k=0;k<G.numVertices;k++){
		intdegree=0,outdegree=0;
		for(m=0;m<G.numVertices;m++){//出度 
			outdegree += G.Edge[k][m];
		} 
		for(m=0;m<G.numVertices;m++){//入度 
			intdegree += G.Edge[m][k];
		} 
		if(outdegree>intdegree){//输出k顶点 
			printf("%d",G.VerticesList[k]);
			count++;//k顶点个数加1 
		} 
	}
	return count;
}

题目要求用Java实现给定一个无向图g=<v,e>,需要对其的每一个顶点着1,2,3三种颜色之一。 在Java,我们可以使用图算法的染色算法来实现这个要求。具体的实现思路如下: 1. 定义一个整型数组colors来表示图每个顶点的颜色,数组大小与图顶点个数一致。 2. 遍历图的每个顶点,按照顺序依次对其进行染色。 3. 对于当前顶点,首先判断它的邻接顶点已经被染色的颜色集合,然后选择一个未被使用的颜色对其进行染色。 4. 重复步骤3,直到所有顶点都被染色为止。 具体的伪代码如下所示: ``` colorGraph(graph): // 初始化每个顶点的颜色都为0,表示未着色 colors = new int[graph.getVertexCount()] // 遍历图的每个顶点 for each vertex in graph.getVertices(): // 获取当前顶点的邻接顶点颜色的集合 neighborColors = getNeighborColors(graph, vertex) // 选择一个未被使用的颜色对当前顶点进行染色 colors[vertex] = getUnusedColor(neighborColors) // 返回着色结果 return colors getNeighborColors(graph, vertex): // 获取当前顶点的邻接顶点 adjacentVertices = graph.getAdjacentVertices(vertex) // 获取邻接顶点已经被染色的颜色集合 neighborColors = [] for each adjacentVertex in adjacentVertices: if colors[adjacentVertex] != 0: neighborColors.add(colors[adjacentVertex]) // 返回邻接顶点已经被染色的颜色集合 return neighborColors getUnusedColor(colors): // 判断当前顶点邻接顶点已经被染色的颜色集合里是否有1,2,3,选择一个未被使用的颜色 for color in [1, 2, 3]: if color not in colors: return color // 如果不存在未被使用的颜色,则返回0,表示当前顶点无法染色 return 0 ``` 该算法的时间复杂度为O(V^2),其V为顶点个数。通过上述算法,即可实现对给定一个无向图着色的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值