HDU-1285-拓扑排序-确定比赛名次

点击打开题目链接

<span style="font-size:18px;"># include <cstdio>
# include <vector>
# include <queue>
# include <cstring>
# include <iostream>
# include <algorithm>
using namespace std;

const int maxn = 500 + 5;
vector <int> g[maxn];
int n,m,du[maxn],l[maxn];

void topsort(){
    int tot = 0;
    priority_queue <int> q; //使用优先队列,默认重大到小;所以存负数;
    for(int i = 1;i <= n;i++)   if(!du[i])  q.push(-i); //将入度为0的点放入队列;
    while(!q.empty()){
        int x = -q.top();q.pop();
        l[tot++] = x;
        for(int j = 0;j < g[x].size();j++){
            int t = g[x][j];
            du[t] --;
            if(!du[t])  q.push(-t);
        }
    }
}

int main()
{
    //freopen("a.txt","r",stdin);
    while(~scanf("%d%d",&n,&m)){
        memset(du,0,sizeof(du));
        memset(l,0,sizeof(l));
        //vector数组清零;
        for(int i = 1;i <= n;i++)   g[i].clear();
        vector <int>::iterator it;
        for(int i = 0;i < m;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            //避免重复边计数;
            it = find(g[x].begin(),g[x].end(),y);
            if(it == g[x].end()){
                g[x].push_back(y);
                du[y] ++;
            }
        }
//        for(int i = 1;i <= n;i++){
//            for(int j = 0;j <g[i].size();j++)   printf("%d ",g[i][j]);
//            printf("\n");
//        }
        //进行拓扑排序;
        topsort();
        for(int i = 0;i < n - 1;i++)    printf("%d ",l[i]);
        printf("%d\n",l[n-1]);
    }
}</span>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 08:06:49

HDU-1285-拓扑排序-确定比赛名次的相关文章

拓扑排序 - 确定比赛名次

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表示

HDU 4857 拓扑排序 优先队列

n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得到的序列就是从大到小的,最后倒序输出就行了. 写这题的时候头好痛阿肚子好痛阿,再也不想熬夜了,一点效率都没有. /** @Date : 2017-09-29 19:29:12 * @FileName: HDU 4857 拓扑排序 + 优先队列.cpp * @Platform: Windows * @

(拓扑)确定比赛名次 -- hdu -- 1285

http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18484    Accepted Submission(s): 7399 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....

HDU 5638 拓扑排序+优先队列

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序的算法稍微改一下,如果某个顶点的入度小于k也把它加到优先队列里面去. k减小后队列里面会有些点不满足<=k,直接踢出来就好了. 代码: #include<iostream> #include<cstring> #include<cstdio> #include<

HDU 2094 拓扑排序

产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 12031    Accepted Submission(s): 5583 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能

hdu 2647 (拓扑排序 邻接表建图的模板) Reward

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员工的奖金多,老板满足了所以员工的这种心思,而且老板下午发的总工资最少,问最少是多少?比如 a b 表示a的工资比b要高(高一块钱),当出现a b   b c   c a这种环的时候输出-1 拓扑排序http://www.cnblogs.com/tonghao/p/4721072.html 小指向大

传递 hdu 5961 拓扑排序有无环~

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5961 题目为中文,这里就不描述题意了. 思路: 从题目陈述来看,他将一个有向图用一个邻接矩阵来表示,并且分为两个图P.Q,但是它们是有内在联系的,即:P+Q,抛去方向即为完全图. 题目都是中文,这里就不翻译了.我们可以从题目中知道,如果P.Q均满足传递性,那么P与(Q的反向图)生成的有向图应该无环. 所以,简单一个拓扑排序检查是否有环即可,P.Q合为一张图,跑一遍,这个还是很快的. 时长:3432MS

HDU 4324 (拓扑排序) Triangle LOVE

因为题目说了,两个人之间总有一个人喜欢另一个人,而且不会有两个人互相喜欢.所以只要所给的图中有一个环,那么一定存在一个三元环. 所以用拓扑排序判断一下图中是否有环就行了. 1 #include <cstdio> 2 #include <cstring> 3 4 const int maxn = 2000 + 10; 5 char G[maxn][maxn]; 6 int c[maxn]; 7 int n; 8 9 bool dfs(int u) 10 { 11 c[u] = -1;

HDU 1325 拓扑排序

根据题目所给的3个不符合情况的条件,一个个判断图是否符合这3个条件即可 1.不能出现内部环,拓扑排序判断 2.不能有超过1个点的入度为0,因为只有一个树根 3.每个点最多一个入度 这里要注意的一点是这个点的数字是乱给的,所以最大值为8,但实际上不一定有8个点,这里记录一个最大值的参数,和一个总共点数的参数来进行判断即可 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using names

hdu 1285 拓扑

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 22679    Accepted Submission(s): 9193 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接