确定比赛名次

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 24193    Accepted Submission(s): 9763

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<queue>
#include<stack>
#include<math.h>
#include<stdio.h>
#include<numeric>//STL数值算法头文件
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<functional>//模板类头文件
using namespace std;
#define MAX 520
int map[MAX][MAX]; //邻接矩阵
int indegree[MAX]; //入度
void toposort(int map[MAX][MAX],int indegree[MAX],int n)
{
int i,j,k=0;
for(i=1; i<=n; i++) //遍历n次
{
for(j=1; j<=n; j++) //出入度为0的节点
{
if(indegree[j]==0)
{
printf("%d%c", j, i == n ? '\n' : ' ');
indegree[j]--;
k=j;
break;
}
}
for(j=1; j<=n; j++) //删除与该节点关联的边
if(map[k][j]==1)
{
map[k][j]=0;
indegree[j]--;
}
}
}
int main()
{
int n,m; //n:关联的边数,m:节点数
while(scanf("%d %d",&n,&m)==2&&n!=0)
{
int i;
int x,y;
memset(map,0,sizeof(map));
memset(indegree,0,sizeof(indegree));
for(i=1; i<=m; i++)
{
scanf("%d %d",&x,&y);
if(!map[x][y])
{
map[x][y]=1;
indegree[y]++;
}
}
toposort(map,indegree,n);
}
return 0;
} 前向星(用存储边的方式存储图)加优先队列实现排序,列题在hdu 1285
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
using namespace std;
const int INF = 1e9+7;
const int VM = 503;// 点的个数
struct node //前向星的结构体
{
int v;//输队编号
int next;
};
node edge[VM * 4];//结构体数组
int head[VM];//头指针数组
int cnt;//下标
int deg[VM];//入度数组
void toposort(int n)
{
priority_queue<int, vector<int>, greater<int> > que;//优先队列
for (int i = 1; i <= n; i++)//找所有点
if (deg[i] == 0) //入度为 0
{
que.push(i);//加入队列
deg[i]--;//入度 变为 -1
}
int k = 1;
while (!que.empty()) //队列不为空
{
int u = que.top();//取出队首的数
que.pop();//删除
printf("%d%c", u, k++ == n ? '\n' : ' ');//输出
for (int i = head[u]; i != -1; i = edge[i].next) //与该点相连的
{
node e = edge[i];//便于书写
deg[e.v]--;//点的入度 -1
if (deg[e.v] == 0)//若此点的 入度为 0
que.push(e.v);//放入队列
}
}
}
int main()
{
int n, m;
int i;
while (scanf("%d %d", &n, &m) == 2) //多组输入,获取n,m
{
memset(head, -1, sizeof(head));//初始化
memset(deg, 0, sizeof(deg));//初始化
cnt = 0;//初始化
while (m--)
{
int u, v;
scanf("%d %d", &u, &v);//获取u,v
for (i = head[u]; i != -1; i = edge[i].next)//查找重边
if (edge[i].v == v)//输入重复数据
break;//不再储存
if (i == -1) //若不是重复数据
{
deg[v]++;//加度
edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt++;
}
}
toposort(n);//调用函数
}
return 0;
}

图论之初,拓扑排序、前向星(通过存储边来存储图)加优先队列对拓扑的优化-----hdu1285的更多相关文章

  1. 拓扑排序入门详解&&Educational Codeforces Round 72 (Rated for Div. 2)-----D

    https://codeforces.com/contest/1217 D:给定一个有向图,给图染色,使图中的环不只由一种颜色构成,输出每一条边的颜色 不成环的边全部用1染色 ps:最后输出需要注意, ...

  2. 拓扑排序--UVa10305

    题目 Output: standard output Time Limit: 1 second Memory Limit: 32 MB John has n tasks to do. Unfortun ...

  3. UVA 1572 Self-Assembly(拓扑排序)

    1 // 把一个图的所有结点排序,使得每一条有向边(u,v)对应的u都排在v的前面. 2 // 在图论中,这个问题称为拓扑排序.(toposort) 3 // 不难发现:如果图中存在有向环,则不存在拓 ...

  4. P4017 最大食物链计数 (拓扑排序)

    看到拓扑排序感觉非常遥远的复杂,不喜欢图.看了拓扑排序的原理,很像广搜. 以本题样例为例: 了解一下 出度 和 入度 5的出度为3 入度为 0 ,3的出度为2  入度为2…… for循环 找到秃头 5 ...

  5. hiho一下 第四十七周 拓扑排序一 【静态数组链式前向星存储结构实现 + 拓扑跳出 】

    题目1 : 拓扑排序·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 由于今天上课的老师讲的特别无聊,小Hi和小Ho偷偷地聊了起来. 小Ho:小Hi,你这学期有选什么 ...

  6. 图论相关知识(DFS、BFS、拓扑排序、最小代价生成树、最短路径)

    图的存储 假设是n点m边的图: 邻接矩阵:很简单,但是遍历图的时间复杂度和空间复杂度都为n^2,不适合数据量大的情况 邻接表:略微复杂一丢丢,空间复杂度n+m,遍历图的时间复杂度为m,适用情况更广 前 ...

  7. poj3249【拓扑排序】

    //题意:   给出一个有向无环图,每个顶点都有一个权值. //         求一条从入度为0的顶点到出度为0的顶点的一条路径, //         路径上所有顶点权值和最大. //我觉得只要明 ...

  8. HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)

    逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...

  9. 使用 C# 代码实现拓扑排序

    0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. https://www.codeproject.com/Articles/869059/Topological-sorti ...

随机推荐

  1. 为eclipse配置javap命令

    javap命令经常使用来对java类文件来进行反编译,主要用来对java进行分析的工具,在学习Thinking in Java时,因为须要对类文件反编译.以查看jvm究竟对我们写的代码做了哪些优化和处 ...

  2. StringUtils.htmlEncode()--html标签过滤方法实现

    package org.guyezhai.utils; import java.text.CharacterIterator; import java.text.StringCharacterIter ...

  3. styled-components真的好吗?

    最近在学习react,然后遇到react中css该怎么写这个问题,上知乎上看了好多大牛都说styled-components好用是大势所趋. 但我自己用了感觉体验却很差,我在这里说说我为啥觉得styl ...

  4. 天梯赛 L2-005 集合相似度 (set容器)

    给定两个整数集合,它们的相似度定义为:Nc/Nt*100%.其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数.你的任务就是计算任意一对给定集合的相似度. 输入格式: 输 ...

  5. zedboard学习记录.1.纯PL流水灯

    环境:vivado 217.4 开发板: zedboard ver.d xc7z020clg484-1 1.打开Vivado新建一个RTL工程. 2.add source->add/create ...

  6. D - Keiichi Tsuchiya the Drift King Gym - 102028D (几何)

    题目链接:https://cn.vjudge.net/contest/275150#problem/D 题目大意: 问你能满足那个矩形可以顺利通过的条件,然后求出最小的w 具体思路:首先,我们应该将情 ...

  7. PHP对象1: 创建对象与 $this

    <?php class perl{ public $name; function __construct($name){ echo '一个对象造好了<br/>'; $this-> ...

  8. ubuntu新机安装工具

    ubuntu新机安装工具:1,sudo apt-get install ssh vim2, 设置root密码,以备不时之需: 执行:sudo passwd root 然后输入当前三次密码,第一次是当前 ...

  9. 在Perl中使用Getopt::Long模块来接收用户命令行参数

    我们在linux常常用到一个程序需要加入参数,现在了解一下perl中的有关控制参数的函数.getopt.在linux有的参数有二种形式.一种是–help,另一种是-h.也就是-和–的分别.–表示完整参 ...

  10. SSL证书生成方法【转】

    转自 SSL证书生成方法 - fyang的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/fyang2007/article/details/6180361 一般情况 ...