数据结构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
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞