贴代码:
#include <bits/stdc++.h>
using namespace std;
#define maxn 100//可以根据题目条件进行更改
int edge[maxn][maxn];
int book[maxn];
int point_num;
int edge_num;
bool check_point(int v)//确定这个点是不是没有入度;
{
for(int i=1;i<=point_num;i++)
if(edge[i][v]==1&&(i!=v))//如果有入度,返回false,i==v时没有啥实际意义
return false;
return true;
}
void del_edge(int v)//删除以这个点为起始点的所有边
{
fill(edge[v],edge[v]+point_num,0);//fill灵活用法,用for循环效果一样,时间复杂度相同
}
int main()
{
memset(book,0,sizeof(book));
scanf("%d",&point_num);
scanf("%d",&edge_num);//点的个数,边的个数,设为宏观变量,比较好操作
memset(edge,0,sizeof(edge));
for(int i=1;i<=edge_num;i++)
{
int s_point,e_point;
scanf("%d%d",&s_point,&e_point);
edge[s_point][e_point]=1;
}
int i;//下面循环代码肯定是能优化的,不过我一时半会想不起来,欢迎留言,私信我
for(;i<=point_num;i++)
{
if(check_point(i)&&book[i]==0)
{
book[i]=1;
cout<<i<<" ";
del_edge(i);//删除bian
i=1;
}
}
for(int i=1;i<=point_num;i++)
{
if(book[i]==0)
cout<<i<<endl;
}//扫尾工作,最后可能会留下一个点;输出格式自己搞!
}