【输入形式】输入第一行为图的类型(1:DG;2:DN;3:UDG;4:UDN)、顶点数和边/弧数,以空格隔开 输入第二行为图中的顶点信息 输入第三 ~ 第(3+边/弧数-1)为图中边/弧的信息 【输出形式】输出第一行为图创建成功提示 输出第二行为深度优先遍历结果 输出第三行为广度优先遍历结果 输出第四行为每个结点的度的信息
【样例输入】3 8 9
1 2 3 4 5 6 7 8
1 2
1 3
2 4
2 5
4 8
5 8
3 6
3 7
6 7
【样例输出】 UDG has been created successfully. DFS traverse: 1 2 4 8 5 3 6 7 BFS traverse: 1 2 3 4 5 6 7 8 The degree of each vertex: 1: 2, 2: 3, 3: 3, 4: 2, 5: 2, 6: 2, 7: 2, 8: 2
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define INFINTTY 32767
#define MAX_VERTEX_NUM 100
#define N 100
typedef enum {DG,DN,UDG,UDN}GraphKind;
typedef struct ArcCell{
int adj;
struct ArcCell *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vis[MAX_VERTEX_NUM];
typedef struct{
int vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum, arcnum;
}MGraph;
typedef struct Node{
int data;
struct Node *next;
}Qnode, *QueuePtr;
typedef struct Queue{
Qnode *front;
Qnode *rear;
}LinkQueue;
void InitQueue(LinkQueue *Q)
{
Q->front=Q->rear=(Qnode*)malloc(sizeof(Qnode));
if(!Q->front)
exit(0);
Q->front->next=NULL;
}
void PushQueue(LinkQueue *q, int e)
{
Qnode* p = (Qnode*)malloc(sizeof(Qnode));
if (!p)
{
exit(0);
}
p->data = e;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
void DetQueue(LinkQueue *q, int *e)
{
if (q->front == q->rear)
{
exit(0);
}
Qnode *p = q->front->next;
e = p->data;
q->front->next = p->next;
if (q->rear == p)
{
q->rear = q->front;
}
free(p);
}
int QueueEmpty(LinkQueue *q)
{
if (q->front == q->rear)
return 0;
else
return 1;
}
void BFSTraverse(MGraph *G)
{
int k, i, m = 8;
LinkQueue Q;
InitQueue(&Q);
for ( i = 0; i < G->vexnum; i++)
{
vis[i] = 0;
}
for ( i = 0; i < G->vexnum; i++)
{
if (!vis[i])
{
vis[i] = 1;
if(G->vexs[i] != m)
printf("%d ", G->vexs[i]);
PushQueue(&Q, i);
}
while (QueueEmpty(&Q))
{
DetQueue(&Q, k);
int j;
for (j = 0; j < G->vexnum; j++)
{
if (G->arcs[i][j].adj == 1 && !vis[j])
{
vis[j] = 1;
if(G->vexs[j] != m)
printf("%d ", G->vexs[j]);
PushQueue(&Q, j);
}
}
}
}
printf("%d", m);
}
int LocateVertex(MGraph *G,int v)
{
int j=0;
int k;
for(k=0;k<G->vexnum;k++)
{
if(G->vexs[k]==v)
{
j=k;
break;
}
}
return j;
}
void CreateUND(MGraph *G)
{
int j, i, k;
scanf("%d %d",&G->vexnum, &G->arcnum);
for(i = 0; i < G->vexnum; i++)
{
scanf("%d", &G->vexs[i]);
}
for(i = 0; i < G->vexnum; i++)
{
for(j = 0; j < G->vexnum; j++)
{
G->arcs[i][j].adj = 0;
}
}
for(k = 0; k < G->arcnum; k++)
{
int v1 , v2;
scanf("%d %d",&v1, &v2);
i = LocateVertex(G,v1);
j = LocateVertex(G,v2);
G->arcs[i][j].adj = 1;
G->arcs[j][i].adj = G->arcs[i][j].adj;
}
}
void CreateDG(MGraph *G)
{
int j, i, k;
scanf("%d %d",&G->vexnum, &G->arcnum);
for(i = 0; i < G->vexnum; i++)
{
scanf("%d", &G->vexs[i]);
}
for(i = 0; i < G->vexnum; i++)
{
for(j = 0; j < G->vexnum; j++)
{
G->arcs[i][j].adj = 0;
}
}
for(k = 0; k < G->arcnum; k++)
{
int v1 , v2;
scanf("%d %d",&v1, &v2);
i = LocateVertex(G,v1);
j = LocateVertex(G,v2);
G->arcs[i][j].adj = 1;
}
}
void put(MGraph *G)
{
int i, j;
for(i = 0; i < G->vexnum; i++)
{
for(j = 0; j < G->vexnum; j++)
{
printf("%d",G->arcs[i][j].adj);
}
printf("\n");
}
}
void DFS(MGraph *G, int i)
{
int j;
vis[i] = 1;
printf("%d ", G->vexs[i]);
for(j = 0; j < G->vexnum; j++)
{
if(G->arcs[i][j].adj == 1 && vis[j] == 0)
{
DFS(G,j);
}
}
}
void DFSTraverse(MGraph *G)
{
int i;
for(i = 0; i < G->vexnum; i++)
{
vis[i] == 0;
}
for(i = 0; i < G->vexnum; i++)
{
if(vis[i] == 0)
{
DFS(G,i);
}
}
}
void Cout(MGraph G)
{
printf("The degree of each vertex: ");
int i,j,s;
for(i=0;i<G.vexnum;i++){
s=0;
for(j=0;j<G.vexnum;j++)
{
if(G.arcs[i][j].adj == 1)
s++;
}
printf("%d: %d",G.vexs[i],s);
if(i != G.vexnum-1)
printf(", ");
}
}
int main()
{
MGraph G;
int n;
scanf("%d", &n);
switch(n)
{
case 1: CreateDG(&G);printf("DG has been created successfully.\n");break;
case 2: CreateDG(&G);printf("DN has been created successfully.\n");break;
case 3: CreateUND(&G);printf("UDG has been created successfully.\n");break;
case 4: CreateUND(&G);printf("UDN has been created successfully.\n");break;
}
printf("DFS traverse: ");
DFSTraverse(&G);
printf("\n");
printf("BFS traverse: ");
BFSTraverse(&G);
printf("\n");
Cout(G);
return 0;
}