您的位置:首页 > 其它

hdu 1285 比赛排名 【拓扑排序】

2015-05-06 21:24 211 查看
拓扑排序模版题

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: