题目及代码:

题目
从键盘接收有向图的顶点集,弧集,创建有向图,并完成下列任务:
(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>
#define MAXVEX 20
int visited[MAXVEX]={0}; 
typedef struct
{
	int arcs[MAXVEX][MAXVEX];
	char vex[MAXVEX];
	int vexnum;
	int arcnum; 
}AdjMatrix;
typedef struct
{
	int data[MAXVEX];
	int front;
	int rear;
}SeqQueue;
SeqQueue Q;
void InitQueue(SeqQueue *Q)
{
	Q->front=Q->rear=MAXVEX-1; 
 } 
int EnterQueue(SeqQueue *Q,int x)
{
	if((Q->rear+1)%MAXVEX==Q->front)return 0;
	Q->rear=(Q->rear+1)%MAXVEX;
	Q->data[Q->rear]=x;
	return 1; 
}
int DeleteQueue(SeqQueue *Q,int *x)
{
	if(Q->front==Q->rear)return 0;
	Q->front=(Q->front+1)%MAXVEX;
	*x=Q->data[Q->front];
	return 1; 
}
int Empty(SeqQueue Q)
{
	if(Q.front==Q.rear)return 1;
	else return 0;
}
int LocateVex(AdjMatrix *G,char v)
{
	int i;
	for(i=1;i<=G->vexnum;i++)
	{
		if(G->vex[i]==v)return i;
	}
	return 0;
}
void Create(AdjMatrix *G)
{
	int i,j,k;
	char vex1,vex2;
	scanf("%d %d",&G->vexnum,&G->arcnum); 
	getchar();
	for(i=1;i<=G->vexnum;i++)
		for(j=1;j<=G->vexnum;j++)
			G->arcs[i][j]=0;
	for(i=1;i<=G->vexnum;i++)
	{
		scanf("%c",&G->vex[i]);
	}
	getchar();
	for(k=0;k<G->arcnum-1;k++)
	{
		scanf("%c%c\n",&vex1,&vex2);
		i=LocateVex(G,vex1);
		j=LocateVex(G,vex2);
		G->arcs[i][j]=1;
	}
	scanf("%c%c",&vex1,&vex2);
	i=LocateVex(G,vex1);
	j=LocateVex(G,vex2);
	G->arcs[i][j]=1;
}
void visit(AdjMatrix g,int v0)
{
	printf("%c",g.vex[v0]);
}
int FirstAdjVex(AdjMatrix g,int v0)
{
	int j;
	for(j=1;j<=g.vexnum;j++)
	{
		if(!visited[j] && g.arcs[v0][j]==1)
			return j;
	}
	return -1;
}
int NextAdjVex(AdjMatrix g,int v0,int w)
{
	int j;
	for(j=1;j<=g.vexnum;j++)
	{
		if(!visited[j] && g.arcs[v0][j]==1 && j!=w)
			return j;
	}
	return -1;
}
void DFS(AdjMatrix g,int v0)
{
	int w;
	visit(g,v0);
	visited[v0]=1;
	w=FirstAdjVex(g,v0);
	while(w!=-1)
	{
		if(!visited[w])DFS(g,w);
		w=NextAdjVex(g,v0,w);
	}
}
void BFS(AdjMatrix g,int v0)
{
	int w;
	int v;
	visit(g,v0);
	visited[v0]=1;
	InitQueue(&Q);
	EnterQueue(&Q,v0);
	while(!Empty(Q))
	{
		DeleteQueue(&Q,&v);
		w=FirstAdjVex(g,v);
		while(w!=-1)
		{
			if(!visited[w])
			{
				visit(g,w);
				visited[w]=1;
				EnterQueue(&Q,w); 
			}
			w=NextAdjVex(g,v,w);
		}
	}
}
void B_TraverseG(AdjMatrix g)
{
	int v;
	for(v=1;v<=g.vexnum;v++)visited[v]=0;
	for(v=1;v<=g.vexnum;v++)
		if(!visited[v])BFS(g,v); 
}
void D_TraverseG(AdjMatrix g)
{
	int v;
	for(v=1;v<=g.vexnum;v++)visited[v]=0;
	for(v=1;v<=g.vexnum;v++)
		if(!visited[v])DFS(g,v);
}
void OD(AdjMatrix g,int s_OD[MAXVEX])
{
	int i,j,count;
	for(i=1;i<=g.vexnum;i++)
	{
		count=0;
		for(j=1;j<=g.vexnum;j++)
		{
			if(g.arcs[i][j]==1)
				count++;
		}
		s_OD[i]=count;
	}
}
void ID(AdjMatrix g,int s_ID[MAXVEX])
{
	int i,j,count;
	for(i=1;i<=g.vexnum;i++)
	{
		count=0;
		for(j=1;j<=g.vexnum;j++)
		{
			if(g.arcs[j][i]==1)
				count++;
		}
		s_ID[i]=count;
	}
}
int main()
{
	int v;
	int s_OD[MAXVEX]={0};
	int s_ID[MAXVEX]={0};
	AdjMatrix g;
	Create(&g);
	OD(g,s_OD);
	ID(g,s_ID);
	for(v=1;v<=g.vexnum;v++)
	{
		printf("%c %d %d %d\n",g.vex[v],s_OD[v],s_ID[v],s_OD[v]+s_ID[v]);
	}
	D_TraverseG(g);
	printf("\n");
	B_TraverseG(g);
	return 0;
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐