HDU 1285

时间:2023-03-09 04:35:30
HDU  1285

#include<stdio.h>
#include<string.h>
int degree[505],vis[505],map[501][501];
int main()
{
int n,m,a,b,i,j,min;
while(~scanf("%d%d",&n,&m))
{
memset(degree,0,sizeof(degree));
memset(vis,0,sizeof(vis));
memset(map,0,sizeof(map));
while(m--)
{
scanf("%d%d",&a,&b);
if(!map[a][b]) //重边不计!(此题测试数据有重边);
{
degree[b]++;
map[a][b] = 1;
}
}
min = 501;
for(i = 0;i < n;i ++)
{
for(j = 1;j <= n;j ++)    //寻找入度为0且编号最小的边;
{
if(degree[j] == 0 && j < min && vis[j] == 0)
min = j;
}
vis[min] = 1; //把该点销毁;
if(i != n-1)
printf("%d ",min);
else
printf("%d\n",min);
for(j = 1;j <= n;j ++) // 处理与该点相关的并以该点作为入度的所有点;
{
if(j != min && vis[j] == 0)
{
if(map[min][j] == 1)
{
degree[j]--;
map[min][j] = 0; //销毁边;
}
}
}
min = 501;
}
}
return 0;
}