hdu1285(记录拓扑排序板子)

2人阅读 评论(0) 收藏 举报
分类:
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
 

#include<stdio.h>
#include<queue>
#include<set>
#include<functional>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
struct node
{
    int v;
    int nextt;
//    friend bool operator<(node a,node b)
//    {
//        return a.v>b.v;
//    }
}e[1005];
priority_queue<int,vector<int>,greater<int> >q;
int n,m;
int r;
int first[505],in[505],z[505];
void add(int x,int y)
{
    e[r].v=y;
    e[r].nextt=first[x];
    first[x]=r++;
}
int k;
void tp()
{
    while(!q.empty())
    {
        q.pop();
    }
    node x;
    for(int i=1;i<=n;i++)
    {
        if(in[i]==0)
            q.push(i);
    }
    k=0;
    while(!q.empty())
    {
        int u=q.top();
        q.pop();
        z[k++]=u;
        in[u]--;
        for(int i=first[u];i!=-1;i=e[i].nextt)
        {
            int x=e[i].v;
            in[x]--;
            if(in[x]==0)
                q.push(x);
        }
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        int a,b;
        r=0;
        memset(first,-1,sizeof(first));
        memset(in,0,sizeof(in));
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            add(a,b);
            in[b]++;
        }
        tp();
        printf("%d",z[0]);
        for(int i=1;i<k;i++)
            printf(" %d",z[i]);
        printf("\n");
    }
}

查看评论

数据结构JAVA版2017教学视频课程

本课程共28个教学视频课程,22小时的教学时间,深入浅出的理论讲解,用JAVA语言实现每个知识点的代码,大量的上机练习题讲解,通过家家乐停车场,佳佳乐彩票机,佳佳乐通讯录,编译原理的语法分析等项目的综合应用实训,上课PPT,上课源代码等资料可以直接下载使用
  • 2017年03月31日 13:31

hdu1285 确定比赛名次(拓扑排序多种方法)

hdu1285 确定比赛名次(拓扑排序多种方法)
  • u012860063
  • u012860063
  • 2014-07-21 16:02:41
  • 2576

hdu1285确定比赛名次(字典序最小的拓扑排序)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285
  • Delacour_
  • Delacour_
  • 2014-07-22 22:36:19
  • 1094

HDU1285(拓扑排序+优先队列)

坑点有一:将排名建图的时候注意重边只能算一条边,因为相同的边不会影响名次,即其实每个节点如果存在前驱的话其实这个节点入度只能为1 代码如下: #include #include #include ...
  • zzycsx
  • zzycsx
  • 2015-12-16 17:45:05
  • 697

KM算法板子

//原题HDU2255 /*其实在求最大 最小的时候只要用一个模板就行了,把边的权值去相反数即可得到另外一个.求结果的时候再去相反数即可*/ /*最大最小有一些地方不同。。*/ #include ...
  • qq_15681523
  • qq_15681523
  • 2015-08-18 00:48:16
  • 290

Uva10305给任务排序(拓扑排序 板子题)

传送门 https://vjudge.net/problem/UVA-10305 #include using namespace std; const int maxn=1000; int ...
  • Jamence
  • Jamence
  • 2017-08-24 21:47:52
  • 107

hdu1285(拓扑排序)

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S...
  • qq_25576697
  • qq_25576697
  • 2017-08-19 20:34:23
  • 75

拓扑排序(hdu1285)

//典型的拓扑排序算法(邻接阵形式),可以作为拓扑排序的模板  ac代码: #include #include #define MAXN 600 int n, m, indegree[MA...
  • vegeta_d
  • vegeta_d
  • 2016-11-20 13:45:38
  • 118

hdu1285拓扑排序

#include #include #define N 509 int in[N],sortq[N]; struct node{ int v; int next; }edg[N]; int...
  • u010073953
  • u010073953
  • 2014-06-12 10:09:18
  • 289

hdu1285 拓扑排序

简单的拓扑排序应用 采用邻接矩阵: #include #include #include using namespace std; #define maxn 505 int map...
  • a569329637
  • a569329637
  • 2013-09-23 16:14:28
  • 327
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 817
    排名: 6万+