HDU1285 确定比赛名次

拓扑排序:

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。 通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
拓扑排序的实现方法:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.

 1 #include<stdio.h>
 2 #include<memory.h>
 3
 4 int map[507][507];
 5 int in[507];
 6 int topsort[507];
 7
 8 int n,m,i,j;
 9
10 void tsort()
11 {
12     for(i=1;i<=n;i++)
13         {
14             int k =1;
15             while(in[k]!=0) k++;
16             in[k] = -1;
17
18             topsort[i] = k;
19             for(j=1;j<=n;j++)
20             {
21                 if(map[k][j]==1){
22                     in[j]--;
23                 }
24             }
25         }
26 }
27 int main(){
28     while(scanf("%d%d",&n,&m)!=EOF)
29     {
30         int a,b;
31         memset(map,0,sizeof(map));
32         memset(in,0,sizeof(in));
33         memset(topsort,0,sizeof(topsort));
34         for(i=0;i<m;i++)
35         {
36             scanf("%d%d",&a,&b);
37             if(map[a][b] == 0)
38             {
39                 map[a][b] = 1;
40                 in[b]++;
41             }
42         }
43         tsort();
44         for(i=1;i<n;i++)
45             printf("%d ",topsort[i]);
46         printf("%d\n",topsort[i]);
47     }
48 }

时间: 2024-10-31 18:16:29

HDU1285 确定比赛名次的相关文章

HDU1285 确定比赛名次 【拓扑排序】

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

hdu1285 确定比赛名次 (拓扑排序)

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

HDU1285 确定比赛名次【拓扑排序】【优先队列】

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

hdu1285 确定比赛名次(拓扑排序)

确定比赛名次 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 51   Accepted Submission(s) : 32 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,

HDU1285确定比赛名次

确定比赛名次                                Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)                                                    Total Submission(s): 23876    Accepted Submission(s): 9630 Problem Descriptio

HDU1285——确定比赛名次(拓扑排序)

http://acm.hdu.edu.cn/showproblem.php?pid=1285 题意:是通过已知的比赛结果,判断名次. 1.用邻接矩阵存储 2.用一个一维数组存储当前点的入度.当该点的入度是0时,输出该点,并将与他相连的点的度数减一.寻找下一个读数为0的点..... #include<cmath> #include<cstring> #include<iostream> using namespace std; int G[505][505],a,b; i

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前.现在请你编程序确定排名. Input 输入有若干组,每组中的第一行为二个数N(1<=N&l

HDU1285确定比赛名次 + 拓扑排序

原题连接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 #include<stdio.h> #include<stdlib.h> #define Max 510 typedef struct vert { int num; //结点编号 struct vert* next; }G_v; typedef struct node { int InDgree,OutDgree; //出度和入度 G_v* next; }G_n; G_n g[

【HDU1285】确定比赛名次

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