#include <iostream>
#include <cstring>
using namespace std;
int map[1123][1123];
int in[1123]; /// 记录入度
void Topo(int n)
{
int flag;
for(int i = 1; i <= n; i++)
{
flag = 0;
for(int j = 1; j <= n; j++)
{
if(0 == in[j]) /// 如果存在入度为零的点
{
flag = 1;
in[j] = -1; /// 将该节点标记删除
for(int k = 1; k <= n; k++)
{
if(map[j][k]) /// 将与该节点相连的点的入度-1
{
in[k]--;
}
}
break;
}
}
// if(!flag) /// 如果结点未输出完,图中就没有了入度为零的结点,证明有环,则不合法
// {
// break; /// 提高效率
// }
}
if(flag)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
int main()
{
int n, m;
while(cin >> n >> m)
{
memset(map, 0, sizeof(map));
memset(in, 0, sizeof(in));
while(m--)
{
int u, v;
cin >> u >> v;
map[u][v] = map[v][u] = 1;
in[v]++;
}
Topo(n);
}
return 0;
}
判断给定图是否存在合法拓扑序列
最新推荐文章于 2020-11-25 23:51:07 发布