#include "iostream"
#include "stack"
#include "vector"
#include "string.h"
#define min(a, b) a < b ? a : b
using namespace std;
const int MAX_V = 100;
int visit[MAX_V]; //1表示已访问过,0表示未访问,-1表示正在访问
vector<int> G[MAX_V];
int V;
int cmp[MAX_V]; //拓扑排序顶点标号
int t;
void addEdge(int from, int to)
{
G[from].push_back(to);
}
bool dfs(int v)
{
visit[v] = -1;
for(int i=0; i<G[v].size(); i++)
{
int u = G[v][i];
if(visit[u] == -1) //存在有向环
return false;
if(!visit[u] && !dfs(u))
return false;
}
visit[v] = 1;
cmp[--t] = v;
return true;
}
bool toposort()
{
t = V;
memset(visit, 0, sizeof(visit));
for(int i=1; i<=V; i++)
if(!visit[i])
if(!dfs(i))
return false;
return true;
}
int main()
{
V = 4;
addEdge(1, 2);
addEdge(1, 3);
addEdge(2, 4);
addEdge(3, 4);
if(!toposort())
cout << "不存在拓扑排序!";
else
{
cout << "拓扑排序为:" << endl;
for(int i=0; i<V; i++)
cout << cmp[i] << " ";
}
cout << endl;
return 0;
}
拓扑排序
最新推荐文章于 2021-06-18 16:59:41 发布