数据结构acm——有向图的创建、求度、遍历

问题 A: DS_7.1 有向图的创建、求度、遍历(by Yan)

问题 A: DS_7.1 有向图的创建、求度、遍历(by Yan)

题目描述

从键盘接收有向图的顶点集,弧集,创建有向图,并完成下列任务:

(1)计算结点的出度、入度以及度;

  (2) 从第一个顶点出发,求一个深度优先遍历序列;

  (3) 从第一个顶点顶点出发,求一个广度优先遍历序列。

 注意:以用户输入各个顶点的顺序为顶点的序号。

          在深度和广度优先遍历中,优先选择序号小的顶点。

输入

第一行输入两个整数,以空格隔开,分别代表图的顶点数n和弧数e。(顶点个数<=20)
第二行依次输入顶点值,类型为字符,中间不用间隔符。
接下去有e行,每行为两个字符 uv(中间没有间隔符),表示一条弧<u,v>。

输出

连续输出n行,依次为各个结点的出度和入度,格式为【顶点w 出度值 入度值 度值】,四者间用空格隔开。
接下去的一行,输出深度优先遍历顶点序列(顶点间无间隔符)。

最后一行,输出广度优先遍历顶点序列(顶点间无间隔符)。

样例输入

5 7
ABCDE
AB
AE
BC
CD
DA
DB
EC

样例输出

  
   A 2 1 3
B 1 2 3
C 1 2 3
D 2 1 3
E 1 1 2
ABCDE
ABECD
  

我的代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXVEX 20
typedef struct SqStack{
	int vex[MAXVEX];
	int front;
	int rear;
}SqQueue;
typedef struct
{
	int arcs[MAXVEX][MAXVEX];
	int visited[MAXVEX];
	char vex[MAXVEX];
	int vexnum;
	int arcnum;
}AdjMatrix; 
void Create(AdjMatrix *G){ 
	int i,j,k,vex1,vex2;
	char Vex1,Vex2;
//	printf("请输入有向网中的顶点数和边数:\n");
	scanf("%d %d",&G->vexnum,&G->arcnum);
	for(i = 1;i<=G->vexnum;i++){
		for(j = 1;j<=G->vexnum;j++){
			G->arcs[i][j] = 0;
		}
	}
	getchar();
//	printf("请输入有向图中%d个顶点:\n",G->vexnum);
	for(i = 1;i<=G->vexnum;i++){
//		printf("No.%d个顶点:",i);
		scanf("%c",&G->vex[i]);
	}
	getchar();
//	printf("请输入有向图的%d条边",G->arcnum);
	for(k = 0;k<G->arcnum;k++){
//		printf("\nNo.%d条边:\n	顶点",k+1);
		scanf("%c",&Vex1);
		vex1 = Vex1-64;
//		printf("<--->顶点");
		scanf("%c",&Vex2);
		vex2 = Vex2-64;
		getchar();
//		printf("%d %d\n",vex1,vex2);
		G->arcs[vex1][vex2] = 1;
	}
}
/*初始化图的遍历数组*/ 
void initialise(AdjMatrix *G){
	for(int i = 1;i<=G->vexnum;i++){
		G->visited[i] = 0;
	} 
}
/*深度优先*/
void DFS(AdjMatrix *G,int Vo){
	/*类似于先序遍历*/ 
	printf("%c",G->vex[Vo]);
	G->visited[Vo] = 1;    
	for(int i = 1;i<=G->vexnum;i++){
		if(!G->visited[i]&&G->arcs[Vo][i]==1){
			DFS(G,i);
		} 
	} 
}
int FirstAdj(AdjMatrix *G,int Vo){
	for(int i = 1;i<=G->vexnum;i++){
		if(G->arcs[Vo][i]==1&&G->visited[i]!=1){
			return i;
		}
	}
	return -1;
}
int NextAdj(AdjMatrix *G,int Vo,int w){
	for(int i = w+1;i<=G->vexnum;i++){
		if(G->arcs[Vo][i]==1&&G->visited[i]!=1){
			return i;
		}
	}
	return -1;
}
/*广度优先*/
void BFS(AdjMatrix *G,int Vo){
	/*类似于层次遍历*/ 
	printf("%c",G->vex[Vo]);
	G->visited[Vo]= 1;
	SqQueue *Q = (SqQueue *)malloc(sizeof(SqQueue));
	Q->front = 0;
	Q->rear = 0;
	Q->front++;
	Q->vex[Q->front] =Vo;
	while(Q->front-Q->rear!=0){
		Vo = Q->vex[Q->front];
		Q->rear++;
		int w = FirstAdj(G,Vo);
//		printf("%d",w);
		while(w!=-1){
			if(!G->visited[w]){
				printf("%c",G->vex[w]);
				G->visited[w]=1;
				Q->front++;
				Q->vex[Q->front] = w;
			}
			w = NextAdj(G,Vo,w);
//			printf("%d",w);
		}
	}
}
int main(void){
	int i,j;
	AdjMatrix *G = (AdjMatrix *)malloc(sizeof(AdjMatrix));
	Create(G);
	int in[MAXVEX];
	int on[MAXVEX];
	for(i = 1;i<=G->vexnum;i++){
		int count = 0;
		for(j = 1;j<=G->vexnum;j++){
			//printf("%d ",G->arcs[i][j]);
			if(G->arcs[i][j]==1){
				count++;
			}
		}
		on[i] = count;
	}
	for(i = 1;i<=G->vexnum;i++){
		int count = 0;
		for(j = 1;j<=G->vexnum;j++){
			//printf("%d ",G->arcs[i][j]);
			if(G->arcs[j][i]==1){
				count++;
			}
		}
		in[i] = count;
	}
	for(i = 1;i<=G->vexnum;i++){
		printf("%c %d %d %d\n",G->vex[i],on[i],in[i],in[i]+on[i]);
	}
	//深度优先遍历
	initialise(G);
	DFS(G,1);
	printf("\n");
	//广度优先遍历
	initialise(G);
	BFS(G,1);
	return 0;
}
    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/ganlubaba666/article/details/85083368
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞