拓扑排序模版题
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int maxe=250000+10;
const int maxh=500+10;
typedef struct Edge
{
int to,next;
};
Edge E[maxe];
int head[maxh],in[maxh],n,m,cnt;
bool map[maxh][maxh];
void init(int num)
{
for(int i=0;i<=num;i++)
{
head[i]=-1;
in[i]=0;
for(int j=0;j<=num;j++)
map[i][j]=false;
}
cnt=0;
}
void add(int a,int b)
{
E[cnt].to=b;
E[cnt].next=head[a];
head[a]=cnt++;
}
int main()
{
int x,y,sum;
while(~scanf("%d%d",&n,&m))
{
init(n);
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
if(!map[x][y])
{
map[x][y]=true;
add(x,y);
in[y]++;
}
}
priority_queue<int,vector<int>,greater<int> >Q;
for(int i=1;i<=n;i++)
{
if(!in[i])
{
Q.push(i);
}
}
sum=n;
while(!Q.empty())
{
int fir=Q.top();
sum--;
Q.pop();
if(sum)printf("%d ",fir);
else printf("%d\n",fir);
for(int i=head[fir];i+1;i=E[i].next)
{
in[E[i].to]--;
if(!in[E[i].to])
{
Q.push(E[i].to);
}
}
}
}
return 0;
}