杭州电子科技大学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

1285

31MS

1232K

rid=12236157" target="_blank">1128 B

C

巧若拙

12235820

2014-11-19 13:07:33

Accepted

pid=1285">1285

15MS

460K

4004 B

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)”解题报告的更多相关文章

  1. 西安电子科技大学第16届程序设计竞赛 G-小国的复仇

    西安电子科技大学第16届程序设计竞赛网络同步赛 G-小国的复仇 2 链接:https://www.nowcoder.com/acm/contest/107/G来源:牛客网 题目描述 众所周知,汀老师是 ...

  2. 一个工作13年的SAP开发人员的回忆:电子科技大学2000级新生入学指南

    让我们跟着Jerry的文章,一起回到本世纪初那个单纯美好的年代. 2000年9月,Jerry告别了自己的高中时代,进入到自己心目中的电子游戏大学,开始了四年的本科生活.每个新生,都拿到了这样一本薄薄的 ...

  3. 【科研】科研【合同】盖章流程/横向&#183;非涉密/电子科技大学

    [前置手续] 一.在科研管理系统里填单子,立项. 二.科研管理系统审核通过后,对于对面给好的合同,在合同系统里选择[合同业务发起-发起非标准合同],填单子. 三.会有一系列的审核,审核完成后打印合同备 ...

  4. hduoj 1285 确定比赛名次

    http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory ...

  5. HDU 1285 确定比赛名次(简单拓扑排序)

    题目链接: 传送门 确定比赛名次 Time Limit: 1000MS     Memory Limit: 65536K Description 有N个比赛队(1 Input 输入有若干组,每组中的第 ...

  6. ACM: HDU 1285 确定比赛名次 - 拓扑排序

     HDU 1285 确定比赛名次 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u De ...

  7. HDU 1285 确定比赛名次

    传送门 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  8. HDU 1285 拓普排序 基本模板例题 确定比赛名次

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  9. TOJ3651确定比赛名次

    确定比赛名次   Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte Total Submit: 23          ...

随机推荐

  1. struts2笔记08-初识ActionSupport

    1.配置一个最简单的action <action name="simple-action"> <result>/simple.jsp</result& ...

  2. 21. 无法执行该操作,因为链接服务器”Server_202”的 OLE DB 访问接口 “SQLNCLI10″ 无法启动分布式事务”

    无法执行该操作,因为链接服务器”Server_202”的 OLE DB 访问接口 “SQLNCLI10″ 无法启动分布式事务” 原因:调用存储过程的方式有问题,必须用JDBC方式调用存储过程才可以正常 ...

  3. 提高Delphi的编译速度(bpl和bcp)

    delphi的编译速度提高(一) 此博文为原创,转载请注明出处 作者 :二娃 此博文的内容我曾经回答群内和论坛内的网友提问时回答过,现在写第一部分,第二部分,我再给出一个终极的提高速度的方法 我用过d ...

  4. html 基本标签

    HTML 基本标签 Web 服务器工作原理 HTML 注释 HTML 基本标签 http://192.168.32.36:8080/scan/demo.html scan 表示你的应用资源目录 HTM ...

  5. linux 磁盘空间扩容 vg(+pv) lv(+空间) lv(缩减磁盘空间)

    preFace APP scenario description: 当你未能合理的规划存储时,在后期的维护工作中可能会涉及的存储的 再规划(eg,某一个 or 数个App 对某一个lv 即挂载点写Bi ...

  6. 特卖电商俏物悄语或面临破产 ihush域名夭折?:域名新闻:域名门户:eName.CN

    特卖电商俏物悄语或面临破产 ihush域名夭折?:域名新闻:域名门户:eName.CN 特卖电商俏物悄语或面临破产 ihush域名夭折?

  7. SharePoint 2013 Designer 自己定义操作菜单

    众所周知,我们在SharePoint的二次开发中,常常会加入ECB菜单或者Ribbon菜单,通常我们会採取Feature的方式去加入一个Xml,或者採取JavaScript的方式.当然.除此之外,还能 ...

  8. javascript中数组排序

    在javascript中Array类中提供了一个可以为数组排序的方法Array.sort(): 但此方法排序方式是按照unicode码进行的排序,若将整数型加入到数组元素中, 排出的结果往往达不到我们 ...

  9. sql获取表字段名、描述和类型

    SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Description = ex.value, ColumnTyp ...

  10. 获取 web容器中的bean

    public class WebContextBeanFinder { public static Object getBean(String beanId) { ServletContext ser ...