由于涉及了一个比较常用的算法,用拓扑排序判断一个有向图是否无环,因此mark下来
#include <iostream>
#include <memory.h>
#include <vector>
#include <stack>
using namespace std;
const int MAX = 1000;
bool graph[MAX][MAX];
bool visited[MAX];
int inDegree[MAX];
bool ifRing = false;
stack<int> zeroInDegreeVertex;
void topologicalSort(int nodeNum, int edgeNum)
{
vector<int> sortElements;
int topNode;
int edges = edgeNum;
while (!zeroInDegreeVertex.empty())
{
topNode = zeroInDegreeVertex.top();
zeroInDegreeVertex.pop();
sortElements.push_back(topNode);
for (int i = 1; i <= nodeNum; i++)
{
if (graph[topNode][i])
{
graph[topNode][i] = false;
inDegree[i]--;
edges--;
if (inDegree[i] == 0)
{
zeroInDegreeVertex.push(i);
}
}
}
}
if (edges > 0)
{
ifRing = true;
}
else
{
ifRing = false;
}
for (int i = 0; i < sortElements.size(); i++)
{
cout << sortElements[i] << " ";
}
cout << endl << endl;
}
int main()
{
int nodeNum;
int edgeNum;
int start;
int end;
bool flag = false;
memset(graph, false, sizeof(graph));
memset(visited, false, sizeof(visited));
memset(inDegree, 0, sizeof(inDegree));
visitedNodeNum = 0;
cin >> nodeNum >> edgeNum;
for (int i = 0; i < edgeNum; i++)
{
cin >> start >> end;
graph[start][end] = true;
inDegree[end]++;
}
for (int i = 1; i <= nodeNum; i++)
{
if (inDegree[i] == 0)
{
zeroInDegreeVertex.push(i);
}
}
topologicalSort(nodeNum, edgeNum);
if (ifRing == true)
cout << "0" << endl;
else
cout << "1" << endl;
return 0;
}