这是一道赤裸裸的拓扑排序,题意是:首先输入n个点,表示有向图中有n个点,接下来n行,每行输入几个数字,第i行的数字表示顶点i个后继节点,当数字为0时,表示i点没有后继节点了。要求这个有向图的拓扑序列。
思路:要求有向图的拓扑序列,就要对图进行搜索,所以这个算法是基于图的搜索的,可用深搜,也可用广搜
基于深搜的代码:(栈为辅助数据结构)
/*
* File: main.cpp
* Author: Administrator
*
* Created on 2010年1月26日, 上午11:50
*/
#include <stdlib.h>
#include<iostream>
#include<deque>
#include<stack>
using namespace std;
#define N 105
struct Node {
int i;
int next_num;
int next[N];
int In_Degree;
} node[N];
Node nod;
int Top_Order[N];
stack<Node>Stack;
void Call_indegree(int n) {
int k, i;
for (i = 1; i <= n; i++) {
node[i].In_Degree = 0;
}
for (i = 1; i <= n; i++) {
node[i].i = i;
node[i].next_num = 0;
while (cin >> k) {
if (k == 0)break;
node[k].In_Degree++;
node[i].next_num++;
node[i].next[node[i].next_num] = k;
}
}
}
void Top_Sort(int n) {
int j, s;
int i = 0;
int t = 0;
for (i = 1; i <= n; i++) {
if (node[i].In_Degree == 0) {
Stack.push(node[i]);
}
}
while (!Stack.empty()) {
nod = Stack.top();
Top_Order[++t] = nod.i;
Stack.pop();
for (j = 1; j <= nod.next_num; j++) {
node[nod.next[j]].In_Degree--;
if (node[nod.next[j]].In_Degree == 0) {
Stack.push(node[nod.next[j]]);
}
}
}
}
/*
*
*/
int main(int argc, char** argv) {
int n, i, j, k;
while (cin >> n) {
Call_indegree(n);
Top_Sort(n);
for (i = 1; i < n; i++) {
cout << Top_Order[i] << " ";
}
cout << Top_Order[n] << endl;
}
return (EXIT_SUCCESS);
}
基于广搜的代码(队列是辅助数据结构,我用的是双向队列)
/*
* File: main.cpp
* Author: Administrator
*
* Created on 2010年1月26日, 上午11:50
*/
#include <stdlib.h>
#include<iostream>
#include<deque>
using namespace std;
#define N 105
struct Node {
int i;
int next_num;
int next[N];
int In_Degree;
} node[N];
Node nod;
int Top_Order[N];
deque<struct Node>q;
void Call_indegree(int n) {
int k, i;
for (i = 1; i <= n; i++) {
node[i].In_Degree = 0;
}
for (i = 1; i <= n; i++) {
node[i].i = i;
node[i].next_num = 0;
//node[i].In_Degree=0;
while (cin >> k) {
if (k == 0)break;
node[k].In_Degree++;
node[i].next_num++;
node[i].next[node[i].next_num] = k;
}
}
}
void Top_Sort(int n) {
int j;
int i = 0;
int t = 0;
for (i = 1; i <= n; i++) {
if (node[i].In_Degree == 0) {
q.push_back(node[i]);
}
}
while (!q.empty()) {
nod = q.front();
Top_Order[++t] = nod.i;
q.pop_front();
for (j = 1; j <= nod.next_num; j++) {
node[nod.next[j]].In_Degree--;
if (node[nod.next[j]].In_Degree == 0) {
q.push_back(node[nod.next[j]]);
}
}
}
}
/*
*
*/
int main(int argc, char** argv) {
int n, i, j, k;
while (cin >> n) {
Call_indegree(n);
Top_Sort(n);
for (i = 1; i < n; i++) {
cout << Top_Order[i] << " ";
}
cout << Top_Order[n] << endl;
}
return (EXIT_SUCCESS);
}