拓扑排序 判断有无闭环
重点在队列及查找
与 hdoj 1285 比不需要找出最小序列,正常写就行
queue<int>q;
int cnt=0;
for(int i=0;i<n;i++)
{
if(li[i].in==0){
q.push(i);
visit[i]=1;
}
}
while (!q.empty())
{
int index=q.front();q.pop();visit[index]=1;cnt++;
for(int i=0;i<li[index].arr.size();i++)
{
li[li[index].arr[i]].in--;
if(li[li[index].arr[i]].in==0&&visit[li[index].arr[i]]==0)
q.push(li[index].arr[i]);
}
}
visit[]用来判断是否访问,应该多余了
ac:
#include <bits/stdc++.h>
using namespace std;
int rela[105][105]={0};
struct node
{
vector<int>arr;
int in;
};
node *li=new node [105];
int main()
{
//freopen("C:\\Users\\Lenovo\\Desktop\\input.txt","r",stdin);
int n,m,x,y;
while (~scanf("%d%d",&n,&m)&&n&&m)
{
vector<int>ans;
int visit[105]={0};
for(int i=0;i<n;i++)
{
memset(rela[i],0,sizeof(rela[i]));
li[i].in=0;li[i].arr.clear();
visit[i]=0;
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
li[x].arr.push_back(y);
li[y].in++;
}
queue<int>q;
int cnt=0;
for(int i=0;i<n;i++)
{
if(li[i].in==0){
q.push(i);
visit[i]=1;
}
}
while (!q.empty())
{
int index=q.front();q.pop();visit[index]=1;cnt++;
for(int i=0;i<li[index].arr.size();i++)
{
li[li[index].arr[i]].in--;
if(li[li[index].arr[i]].in==0&&visit[li[index].arr[i]]==0)
q.push(li[index].arr[i]);
}
}
if(cnt==n)printf("YES\n");
else printf("NO\n");
}
return 0;
}