基本拓扑排序问题。
一开始wa,经过一番纠结后发现是统计各结点入度时出了问题:输入数据可能会有重复,而我统计入度在读入的时候就执行,并且一开始没有判断该边是否已存在。
#include<cstdio>
#include <cstring>
using namespace std;
int map[505][505],indegree[505],res[505],rescnt;
int toplogic_sort(int n)
{
if(rescnt==n)
return 0;
for(int i=1;i<=n;i++)
if(!indegree[i])
{
indegree[i]--;
res[rescnt++]=i;
for(int j=1;j<=n;j++)
if(map[i][j])
{
indegree[j]--;
}
toplogic_sort(n);
}
return 0;
}
void solve(int n,int m)
{
memset(map,0,sizeof(map));
memset(indegree,0,sizeof(indegree));
int x,y;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
if(!map[x][y])
indegree[y]++;
map[x][y]=1;
}
rescnt=0;
toplogic_sort(n);
for(int i=0;i<n-1;i++)
printf("%d ",res[i]);
printf("%d\n",res[n-1]);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)>0)
solve(n,m);
return 0;
}