DYJ-无环图应用
【问题描述】
试编写一算法,给有向无环图G中每个顶点赋以一个整数序号,并满足以下条件:若从顶点i至顶点j有一条弧,则应使i<j。(提示:存储结构采用邻接表,采用拓扑排序算法实现)
【输入形式】
输入图中顶点数和弧数,输入顶点的值序列(值是字符类型),输入弧的顶点偶对序列。
【输出形式】
按顶点值得输入顺序输出各顶点的值和编号序列。
【样例输入】
例如:下图
对应的输入如下:
4,4
abcd
0,1
2,3
【样例输出】
对应的输出如下:
a,1;b,2;c,3;d,4;
C++代码
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct edgenode {
int adjvertex;
edgenode* next;
};
struct vertnode {
char vertex;
edgenode* firstedge;
int indegree;
int number;
};
struct AMgraph {
vertnode vertlist[100];
int n, e;
};
AMgraph* Creategraph() {
AMgraph* g = new AMgraph;
scanf("%d,%d", &g->n, &g->e);
for (int i = 0; i < g->n; i++) {
cin >> g->vertlist[i].vertex;
g->vertlist[i].firstedge = new edgenode;
g->vertlist[i].firstedge->next = NULL;
g->vertlist[i].indegree = 0;
}
int adj1, adj2;
edgenode* p, *temp;
for (int i = 0; i < g->e; i++) { //根据样例可知要采用尾插法
scanf("%d,%d", &adj1, &adj2);
p = new edgenode;
p->adjvertex = adj2;
p->next = NULL;
temp = g->vertlist[adj1].firstedge;
while (temp->next != NULL) temp = temp->next;
temp->next = p;
g->vertlist[adj2].indegree++;
}
return g;
}
void Topologicalsort(AMgraph* g) { //拓扑排序
queue<int> q;
int cnt = 0;
for (int i = 0; i < g->n; i++)
if (g->vertlist[i].indegree == 0) q.push(i);
int f, inq;
edgenode* p;
while (!q.empty()) {
f = q.front();
q.pop();
g->vertlist[f].number = ++cnt;
for (p = g->vertlist[f].firstedge->next; p; p = p->next) {
inq = p->adjvertex;
if ((--g->vertlist[inq].indegree) == 0)
q.push(inq);
}
}
}
void Print(AMgraph* g) {
for (int i = 0; i < g->n; i++)
cout << g->vertlist[i].vertex << "," << g->vertlist[i].number << ";";
}
int main() {
AMgraph* g = Creategraph();
Topologicalsort(g);
Print(g);
return 0;
}