4月7日凌晨睡觉前的拓扑调试
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define maxn 100000
int inn[maxn],edge[maxn],to[maxn],next[maxn],pre[maxn],visit[maxn];
int n,m,num=0;
queue<int> Q;
void clear()
{
memset(inn,0,sizeof(int));
memset(visit,0,sizeof(int));
memset(to,0,sizeof(int));
memset(next,0,sizeof(int));
memset(pre,0,sizeof(int));
}
void addedge(int x,int y)
{
inn[y]++,num++;//入度加一,编号加一
next[num]=pre[x], pre[x]=num,to[num]=y;
}
void work(int x)
{
int t,p;
Q.push(x);
while(!Q.empty())
{
t=Q.front(),Q.pop();
printf("%d ",t);
p=pre[t];
while(p)
{
inn[to[p]]--;
if(!inn[to[p]]) Q.push(to[p]);//注意这里是inn[to[p]]而不是to[p]
p=next[p];
}
}
}
int main()
{
int temp1,temp2;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&temp1,&temp2);
addedge(temp1,temp2);
}
for(int i=1;i<=n;i++)
if(!inn[i])
{
work(i);
break;
}
return 0;
}
评论