自己学到拓补排序找到这个题目,看着挺简单,其实有一些坑点,结果wrong了很多次,不过还好最终做了出来。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m;
int graph[550][550];
int value[550];
int indegree[550];
void tuobu()
{
int Count=0;
int cnt=0;
while(Count<n)
{
for (int i=1;i<=n;++i)
{
if (value[i]==0&&graph[i][i]==0)
{
Count++;
indegree[cnt++]=i;
graph[i][i]=1;
for (int j=1; j<=n; ++j)
{
if (graph[i][j]==1&&i!=j&&graph[j][j]==0)
{
if (value[j]>0)
--value[j];
}
}
break;//这里的break,加入的目的就是保证它能按规定要求顺序输入
}
}
}
for (int i=0;i<n-1;++i)
{
printf("%d ",indegree[i]);
}
printf("%d\n",indegree[n-1]);
}
int main()
{
while(cin>>n>>m)
{
int num1,num2;
memset(value,0,sizeof(int)*(n+1));
memset(graph,0,sizeof(graph));
memset(indegree,0,sizeof(indegree));
while(m--)
{
scanf("%d %d",&num1,&num2);
if (!graph[num1][num2])//咳咳,看了这个判断就知道数据的坑点在哪了吧。。。。。就是这被坑大了
{
graph[num1][num2]=1;
graph[num1][num1]=0;
graph[num2][num2]=0;
value[num2]++;
}
}
tuobu();
}
}