杭州电子科技大学Online Judge 之 “确定比赛名次(ID1285)”解题报告
杭州电子科技大学Online Judge
之 “确定比赛名次(ID1285)”解题报告
巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo)
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
算法分析:
本题是拓扑排序的典型应用。
的顶点存储到拓扑序列中即可了。算法思路比較清晰。代码也比較简洁。但时间复杂度和空间复杂度都较高。
的顶点按递减序排序,然后对图进行深度优先搜索,能获得正确的拓扑序列。
本算法时间复杂度和空间复杂度都非常好。可是代码较长。
两种算法都给出代码,大家能够比較一下。并请提出宝贵意见。
说明:
算法思想:拓扑排序,折半插入。
数据结构:邻接矩阵。邻接表。
:O(N^2);当中N为顶点数量;
:O(N+M);当中N为顶点数量。M为边的数量
:O(MAXN^2);当中MAXN为最大顶点数量;
:O(MAXN +M);当中MAXN为最大顶点数量;M为边的数量。
|
Run ID |
Submit Time |
Judge Status |
Pro.ID |
Exe.Time |
Exe.Memory |
Code Len. |
Language |
Author |
|
12236157 |
2014-11-19 14:09:06 |
Accepted |
31MS |
1232K |
C |
|||
|
12235820 |
2014-11-19 13:07:33 |
Accepted |
15MS |
460K |
C |
代码例如以下:
:
#include<stdio.h>
#include<stdlib.h>
#define MAXN 502 //最大顶点数量
int map[MAXN][MAXN] = {0};
void TopoLogicalSort(int n);
int main()
{
int i, j, m, n, u, v;
while(scanf("%d%d", &n,&m) != EOF)
{
for (i=0; i<MAXN;i++)
for (j=0; j<MAXN; j++)
map[i][j] = 0;
for (i=0; i<m; i++)
{
scanf("%d%d", &u, &v);
if (map[u][v] == 0) //数据可能会反复
{
map[u][v] = 1;
map[0][v]++; //存储顶点v的入度
}
}
TopoLogicalSort(n);
}
return 0;
}
void TopoLogicalSort(int n)
{
int i, j, top;
int topo[MAXN] = {0};
for (top=0; top<n; top++)//总共同拥有n个顶点,搜索n次
{
的序号最小的顶点
{
if(map[0][i] == 0)
{
map[0][i]= -1;
break;
}
}
topo[top]= i;
for(j=1; j<=n; j++) //弧尾i相应弧头j入度减1
{
if(map[i][j] == 1)
map[0][j]--;
}
}
for (i=0; i<top-1; i++)
{
printf("%d", topo[i]);
}
printf("%d\n", topo[top-1]);
}
:
#include<stdio.h>
#include<stdlib.h>
#define MAXN 510 //最大变量(顶点)数量
typedef int VertexType; //顶点类型由用户自己定义
typedef int EdgeType; //边上的权值类型由用户自己定义
typedef struct EdgeNode{ //边表结点
int adjvex; //邻接点域,存储该顶点相应的下标
// EdgeType weight; //权值,对于非网图能够不须要
struct EdgeNode *next; //链域,指向下一个邻接点
} EdgeNode;
typedef struct VertexNode{ //顶点表结点
VertexType data; //顶点域,存储顶点信息
int in; //存储顶点入度的数量
EdgeNode *firstEdge; //边表头指针
} VertexNode;
void CreateGraph(VertexNode*GL, int n, int m);//把顶点和边信息读入到表示图的邻接表中
int InsertStack(int vec[],int x, int n);//折半插入,递减排序
voidTopoLogicalSort_DFS(VertexNode *GL, int n);
int main()
{
int i, m, n;
VertexNode GL[MAXN];
while(scanf("%d%d", &n,&m) != EOF)
{
CreateGraph(GL, n,m);//把顶点和边信息读入到表示图的邻接表中
TopoLogicalSort_DFS(GL, n);
}
return 0;
}
void CreateGraph(VertexNode*GL, int n, int m)//把顶点和边信息读入到表示图的邻接表中
{
int i, u, v;
EdgeNode *e;
for (i=1; i<=n; i++)//初始化图
{
GL[i].data = i;
GL[i].in = 0;
GL[i].firstEdge = NULL;
}
for (i=0; i<m; i++)
{
e = (EdgeNode*)malloc(sizeof(EdgeNode));//採用头插法插入边表结点
if (!e)
{
puts("Error");
exit(1);
}
scanf("%d%d", &u,&v);
e->next = GL[u].firstEdge;
GL[u].firstEdge = e;
e->adjvex = v;
GL[v].in++;
}
}
int InsertStack(int vec[],int x, int n)//折半插入,递减排序
{
int low = 0, high = n - 1, mid, j;
while(low <= high) //折半查找插入位置
{
mid = (low + high)/2;
if(vec[mid] < x)
{
high = mid -1;
}
else
{
low = mid + 1;
}
}
//进行插入操作
for(j=++n; j>low; j--)
{
vec[j] = vec[j-1];
}
vec[low] = x;
return n;
}
voidTopoLogicalSort_DFS(VertexNode *GL, int n)
{
int i, u, v, top = 0;
int count = 0;
EdgeNode *e;
int topo[MAXN], Stack[MAXN];//有序栈(或优先队列)
的顶点按序号大小逆序入栈
{
if (GL[i].in == 0)
{
top = InsertStack(Stack, i, top);
}
}
while (top > 0)//採用深度优先搜索获取拓扑序列
{
u = Stack[--top];
topo[count++] = u;
的顶点入栈
{
v = e->adjvex;
if (--GL[v].in == 0)
{
top= InsertStack(Stack, v, top);
}
}
}
for (i=0; i<count-1; i++)
{
printf("%d", topo[i]);
}
printf("%d\n", topo[count-1]);
}
杭州电子科技大学Online Judge 之 “确定比赛名次(ID1285)”解题报告的更多相关文章
- 西安电子科技大学第16届程序设计竞赛 G-小国的复仇
西安电子科技大学第16届程序设计竞赛网络同步赛 G-小国的复仇 2 链接:https://www.nowcoder.com/acm/contest/107/G来源:牛客网 题目描述 众所周知,汀老师是 ...
- 一个工作13年的SAP开发人员的回忆:电子科技大学2000级新生入学指南
让我们跟着Jerry的文章,一起回到本世纪初那个单纯美好的年代. 2000年9月,Jerry告别了自己的高中时代,进入到自己心目中的电子游戏大学,开始了四年的本科生活.每个新生,都拿到了这样一本薄薄的 ...
- 【科研】科研【合同】盖章流程/横向·非涉密/电子科技大学
[前置手续] 一.在科研管理系统里填单子,立项. 二.科研管理系统审核通过后,对于对面给好的合同,在合同系统里选择[合同业务发起-发起非标准合同],填单子. 三.会有一系列的审核,审核完成后打印合同备 ...
- hduoj 1285 确定比赛名次
http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- HDU 1285 确定比赛名次(简单拓扑排序)
题目链接: 传送门 确定比赛名次 Time Limit: 1000MS Memory Limit: 65536K Description 有N个比赛队(1 Input 输入有若干组,每组中的第 ...
- ACM: HDU 1285 确定比赛名次 - 拓扑排序
HDU 1285 确定比赛名次 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u De ...
- HDU 1285 确定比赛名次
传送门 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 1285 拓普排序 基本模板例题 确定比赛名次
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- TOJ3651确定比赛名次
确定比赛名次 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte Total Submit: 23 ...
随机推荐
- CSS3 transition 属性
transition是css3中新添加的特性,在W3C标准中是这样描述的:“css的transition允许css的属性值在一定的时间内从一个状态平滑的过渡到另一个状态.这种状态可以在鼠标单击.获得焦 ...
- C++中的引用到底是什么
这也算是一个老生常谈的问题,写这个其实就是想趁着暑假把博客丰富一下. 咱随便在谷哥.度娘.病软引擎上搜搜都可以得到各种关于引用的解释,无非就是"引用不同于指针,引用是一个变量的别名" ...
- spring常量值注入
<context:property-placeholder location="classpath:resources/*.properties" /> @Value( ...
- Linux主要发行版本介绍
Linux主要发行版本介绍 1.Red Hat Linux Red Hat是一个比较成熟的Linux版本,无论在销售还是装机量上都比较可观.该版本从4.0开始同时支持Intel.Alpha及Sparc ...
- [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(七)
目标: 1. 完成最终的设备驱动,增加具体的watchdog设备操作的代码. 测试代码: 代码最终实现见cwd_demo.c 代码只实现了read与write. 没有实现ioctl. 因此,我们可以 ...
- getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()的作用
getCacheDir()方法用于获取/data/data/<application package>/cache目录 getFilesDir()方法用于获取/data/data/< ...
- Android Gson深入分析
眼下解析json有三种工具:org.json(Java经常使用的解析),fastjson(阿里巴巴project师开发的).Gson(Google官网出的).解析速度最快的是Gson,下载地址:htt ...
- 算法精解(C语言描述) 第3章 读书笔记
第3章 递归 1.基本递归 假设想计算整数n的阶乘,比如4!=4×3×2×1. 迭代法:循环遍历其中的每一个数,然后与它之前的数相乘作为结果再参与下一次计算.可正式定义为:n! = (n)(n-1)( ...
- Javascript 原型和原型链
先来了解一下Javascript中的原型:”原型也是一个对象,原型可以用来实现继承...“ 对于 原型,构造函数,以及实例之间的关系:“每个(构造)函数都有一个原型属性,原型对象都包含一个指向构造函数 ...
- 2014.9.3数据库CRUD
CRUD 增删改查 DCL 数据控制语言:备份,grant DML 数据操作语言: CRUD DDL 数据定义语言:create drop alter 自增长列不能赋值 增: Insert into ...