判断是否存在环,每一次找到入度为0的点,将其相关联的点的入度减减,如果还存在入度不为0的点,则原图一定存在环
//暴力
#include <bits/stdc++.h>
using namespace std;
bool Edge[15][15];
int Indegree[15];
bool vis[15];
int main()
{
int n, m;
while(cin >> n >> m)
{
memset(Edge, 0, sizeof(Edge));
memset(Indegree, 0, sizeof(Indegree));
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= m; i++)
{
int u, v;
cin >> u >> v;
Edge[u][v] = 1;
Indegree[v] ++;
}
for(int k = 1; k <= n; k++)
{
for(int i = 1; i <= n; i++)
{
if(Indegree[i] == 0 && !vis[i])
{
vis[i] = 1;
for(int j = 1; j <= n; j++)
if(Edge[i][j])
{
Indegree[j] --;
}
}
}
}
int flag = 1;
for(int i = 1; i <= n; i++)
{
if(Indegree[i] > 0)
{
flag = 0;
break;
}
}
(flag == 1) ? cout << "YES" << endl : cout << "NO" << endl;
}
return 0;
}
//拓扑
#include <bits/stdc++.h>
using namespace std;
int n, num, m;
int Edge[15][15];
int Indegree[15];
queue<int >Q;//栈,队列都行
int Topsort()
{
for(int i = 1; i <= n; i++)
{
if(Indegree[i] == 0)
{
Q.push(i);
}
}
while(!Q.empty())
{
int tmp = Q.front();
Q.pop();
++num;
for(int i = 1; i <= n; i++)
{
if(Edge[tmp][i])
{
Indegree[i] --;
if(Indegree[i] == 0)
{
Q.push(i);
}
}
}
}
(num == n) ? cout << "YES" << endl : cout << "NO" << endl;
}
int main()
{
while(cin >> n >> m)
{
num = 0;
memset(Edge, 0, sizeof(Edge));
memset(Indegree, 0, sizeof(Indegree));
while(m --)
{
int u, v;
cin >> u >> v;
Indegree[v] ++;
Edge[u][v] = 1;
}
Topsort();
}
return 0;
}