竹子听

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;

}


评论