【拓扑排序】
有向无环图,存在结点间的先后关系
1.选择一个入度为0的点,作为序列的第一个结点。当该结点被选为序列的第一个顶点后,将该点从图中删去,同时删除以该结点为弧尾的所有边,得到一个新图。
2.若在所有结点尚未被删去时就已经找不到入度为0的结点时,说明剩余的结点形成一个环路,拓扑排序失败,原图不存在拓扑序列。
3.用队列实现 Q.front() Q.size() Q.pop() Q.push()
#include<iostream>
#include<cstring>
#include<vector>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
#define maxi 0x3f3f3f3f
queue<int> Q;
int in[100];
std::vector<int> v[100];
int main(int argc, char const *argv[])
{
int n,m,a,b,count;
while(cin>>n)
{
cin>>m;
if(n==m&&n==0)break;
memset(in,0,sizeof(in));
count=0;
while(m--)
{
cin>>a>>b;
in[a]++;
v[b].push_back(a);
}
while(!Q.empty())Q.pop();
for(int i=0;i<n;i++)
if(in[i]==0)
Q.push(i);
while(!Q.empty())
{
int nowp=Q.front();
Q.pop();
count++;
for(int i=0;i<v[nowp].size();i++)
{
in[v[nowp][i]]--;
if(in[v[nowp][i]]==0)
Q.push(v[nowp][i]);
}
}
if(count==n)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}