【hzoj 1285】确定比赛名次

来源:互联网 发布:有效抵御网络黑客攻击 编辑:程序博客网 时间:2024/05/18 15:26

Problem Description

有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。

Input

输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。

Output

给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。

其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。

Sample Input

4 3
1 2
2 3
4 3

Sample Output

1 2 4 3

拓扑排序。
网址: http://www.tuicool.com/articles/63UrQb

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=500+5;int l[maxn];bool b[maxn][maxn];void topsort(int n){    int k=0;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {            if(l[j]==0)            {                printf("%d%c",j,i==n?'\n':' ');                l[j]--;                k=j;                break;            }        }        for(int j=1;j<=n;j++)        {            if(b[k][j]==true)            {                b[k][j]=false;                l[j]--;            }        }    }}int main(){    int n,m;    while(~scanf("%d%d",&n,&m))    {        int u,v;        memset(l,0,sizeof(l));        memset(b,0,sizeof(b));        while(m--)        {            scanf("%d%d",&u,&v);            if(b[u][v]==false)            {                b[u][v]=true;                l[v]++;            }        }        topsort(n);    }    return 0;}

邻接表+优先队列

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int MAXN = 100000 + 5;int first[MAXN],next[MAXN];int ru[MAXN];int n,m;int tot;void init(){    memset(first,-1,sizeof(first));    tot = 0;    return;}struct edge{    int f,t;}l[MAXN << 1];void build(int f,int t){    l[++tot] = (edge) {f,t};    next[tot] = first[f];    first[f] = tot;    return;}void top_sort(int n){    priority_queue<int, vector<int>, greater<int> > q;    for(int i = 1;i <= n;i ++)    {        if(ru[i]==0)        {            q.push(i);            ru[i]--;        }    }    int k=0;        while(!q.empty())        {            int u = q.top();            q.pop();            printf("%d%c", u, k++ == n ? '\n' : ' ');            for(int i = first[u];i != -1;i = next[i])            {                ru[l[i].t] --;                if(ru[l[i].t]==0)                q.push(l[i].t);            }        }       return;}int main(){    scanf("%d%d",&n,&m);    init();    memset(ru,0,sizeof(ru));    int f,t;    for(int i = 1;i <= m;i ++)    {        scanf("%d%d",&f,&t);        build(f,t);        ru[t] ++;    }    top_sort(n);    return 0;}
原创粉丝点击