数据结构之有向图的创建求度遍历
题目及代码:题目从键盘接收有向图的顶点集,弧集,创建有向图,并完成下列任务:(1)计算结点的出度、入度以及度;(2) 从第一个顶点出发,求一个深度优先遍历序列;(3) 从第一个顶点顶点出发,求一个广度优先遍历序列。注意:以用户输入各个顶点的顺序为顶点的序号。在深度和广度优先遍历中,优先选择序号小的顶点。输入第一行输入两个整数,以空格隔开,分别代表图的顶点数n和弧数e。(顶点个数&...
题目及代码:
题目
从键盘接收有向图的顶点集,弧集,创建有向图,并完成下列任务:
(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;
}

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