赞
踩
本关任务:用邻接表存储有向图,在顶点表中增加入度域,使用队列存储入度为零的顶点编号,实现AOV网的拓扑排序算法,并输出拓扑序列,顶点个数少于20个。
根据提示,在右侧编辑器补充代码。
输入描述:
首先输入图中顶点个数和边的条数; 输入顶点的信息(字符型); 输入各顶点的入度; 输入各边及其权值。
输出描述:
输出 AOV 网的拓扑序列(顶点信息),以空格隔开,最后一个顶点后面有空格,如果AOV网存在回路,输出"有回路"的信息,占一行。
输入样例1:
6 9
A B C D E F
3 0 1 3 0 2
1 0
1 3
2 0
2 3
3 0
3 5
4 2
4 3
4 5
输出样例1:
B E C D F A
输入样例2:
6 8
A B C D E F
0 0 1 3 2 2
0 2
0 3
1 3
1 5
2 4
3 4
4 5
5 3
输出样例2:
有回路
- #include <stdio.h>
- #include <stdlib.h>
- // 定义弧节点
- struct Arcnode
- {
- int adjvex; // 弧的终点顶点下标
- struct Arcnode *next; // 指向下一个弧节点的指针
- };
- // 定义顶点节点
- struct Vertexnode
- {
- int in; // 顶点的入度
- char vertex; // 顶点的值
- struct Arcnode *firstedge; // 指向第一个弧节点的指针
- };
- #define Maxsize 20
- // 定义邻接表图结构
- typedef struct
- {
- struct Vertexnode adjlist[Maxsize]; // 顶点数组
- int vertexnum; // 顶点数量
- int arcnum; // 弧数量
- } ALgraph;
- // 初始化邻接表图结构
- void ALgraph_init(ALgraph *G, char a[], int n, int e)
- {
- //write your code
- //=======begin=======
- G->vertexnum = n; G->arcnum = e;
- int i, j;
- struct Arcnode *s, *r;
-
- for (int i=0; i<n; i++)
- {
- G->adjlist[i].vertex = a[i];
- G->adjlist[i].firstedge = NULL;
- scanf("%d ", &G->adjlist[i].in);
- }
-
- for (int k=0; k<e; k++)
- {
- scanf("%d %d", &i, &j);
-
- s = (struct Arcnode*)malloc(sizeof(struct Arcnode));
- s->adjvex = j;
- s->next = G->adjlist[i].firstedge;
- G->adjlist[i].firstedge = s;
- }
- //========end========
- }
- // 销毁邻接表图结构
- void ALgraph_destroy(ALgraph *G)
- {
- int i;
- struct Arcnode *p;
- for (i = 0; i < G->vertexnum; i++)
- {
- p = G->adjlist[i].firstedge;
- while (p)
- {
- struct Arcnode *q = p;
- p = p->next;
- free(q);
- }
- }
- }
- // 拓扑排序
- void ALgraph_TopSort(ALgraph *G)
- {
- //write your code
- //=======begin=======
- int front = -1, rear = -1, count = 0, x, k, q[Maxsize], len = 0;
- char s[Maxsize];
- struct Arcnode *p;
-
- for (int i=0; i<G->vertexnum; i++)
- {
- if (G->adjlist[i].in == 0)
- {
- q[++rear] = i;
- }
- }
-
- while (front != rear)
- {
- x = q[++front];
- s[len++] = G->adjlist[x].vertex;
- count++;
- p = G->adjlist[x].firstedge;
-
- while (p)
- {
- k = p->adjvex;
- G->adjlist[k].in--;
-
- if (G->adjlist[k].in == 0)
- {
- q[++rear] = k;
- }
-
- p = p->next;
- }
- }
-
- if (count < G->vertexnum)
- {
- printf("有回路");
- }
- else
- {
- for (int i=0; i<len; i++)
- {
- printf("%c ", s[i]);
- }
- }
- //========end========
- }
- int main()
- {
- int i, n, m;
- scanf("%d%d", &n, &m);
- // 动态申请字符数组
- char *b = (char *)malloc(sizeof(char) * n);
- for (i = 0; i < n; i++)
- {
- scanf(" %c", &b[i]);
- }
- ALgraph al;
- ALgraph_init(&al, b, n, m);
- ALgraph_TopSort(&al);
- ALgraph_destroy(&al);
- // 释放内存
- free(b);
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。