考察拓扑排序
先找到入度为0的点 把与其相邻的点入度-1 循环操作即可 注意判断是否访问该点
#include <bits/stdc++.h>
using namespace std;
struct node
{
vector<int>arr;
int in;
};
node *li=NULL;
int main()
{
//freopen("C:\\Users\\Lenovo\\Desktop\\input.txt","r",stdin);
int m,n,p1,p2;
while (~scanf("%d%d",&m,&n))
{
int visit[501]={0};
queue<int>q;
vector<int>ans;
li=new node[m+1];
for(int i=0;i<=m;i++)
{
li[i].arr.clear();
li[i].in=0;
}
for(int i=0;i<n;i++)
{
scanf("%d%d",&p1,&p2);
li[p1].arr.push_back(p2);
li[p2].in++;
}
for(int i=0;i<m+1;i++)
{
for(int j=1;j<=m;j++)
{
if(li[j].in==0&&visit[j]==0)
{
ans.push_back(j);visit[j]=1;
for(int k=0;k<li[j].arr.size();k++)
{
li[li[j].arr[k]].in--;
}
break;
}
}
}
vector<int>::iterator it=ans.begin();
printf("%d",*it);it++;
for(;it!=ans.end();it++)
printf(" %d",*it);
printf("\n");
}
return 0;
}