SDUT3037--让领导先走(拓扑排序)

让领导先走

Time Limit: 2000MS Memory limit: 65536K

题目描述

完啦完啦,公司里发火灾拉,大家快跑啊,再不跑就没命啦。大家不要乱,请按顺序通过消防通道,说到顺序,那么问题来了。

按照中国特色社会主义文化,我们严格贯彻落实一件事,那就是,让领导先走。

现在又n人,从1标号到n。如果a是b的领导的话,就必须让a排在b的前面。

那么你就要安排大家的顺序。我保证一定有解。

输入

多组输入,然后对于每个测试数据,第一行有两个整数n(1 <= n <= 30000)和m(1 <= m <= 100000),分别表示人数和上下级存在数。

然后m行,每行两个整数a和b,表示有一个a是b的领导。a和b必然不同。

输出

对每个测试数据,输出一行排队的顺序,用空格隔开。

示例输入

5 10
3 5
1 4
2 5
1 2
3 4
1 4
2 3
1 5
3 5
1 2

示例输出

1 2 3 4 5

拓扑排序,数据比较大,应该用邻接表,不过这个题的后台数据水,用数组也过了。
 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<string.h>
 6 #define MAXN 5001
 7 short int mapp[MAXN][MAXN];
 8 int in[MAXN], vis[MAXN];
 9 int n, m;
10
11 void topo()
12 {
13     int i, j, k, cnt =0, flag=0,ss=0;
14     for(i=1; i<=n; i++)
15     {
16         for(j=1; j<=n; j++)
17         {
18            if(in[j]==0 && !vis[j])
19            {
20                    cnt++;
21                    if(ss==n)
22                 {
23                     flag =1;
24                     break;
25                 }
26                    if(cnt==n)
27                 {
28                     printf("%d\n", j);
29                     ss++;
30                     break;
31                 }
32                 else
33                 {
34                     printf("%d ", j);
35                     ss++;
36                 }
37            }
38         }
39         if(flag) break;
40         if(in[i]==0)
41         {
42             for(k=1; k<=n; k++)
43             {
44                 if(mapp[i][k])
45                 {
46                     in[k]--;
47                 }
48             }
49             vis[i]=1;
50         }
51     }
52 }
53
54 using namespace std;
55
56 int main()
57 {
58     int x, y, i;
59     while(~scanf("%d%d", &n, &m))
60     {
61         memset(mapp, 0, sizeof(mapp));
62         memset(in, 0, sizeof(in));
63         memset(vis, 0, sizeof(vis));
64         for(i=0; i<m; i++)
65         {
66             scanf("%d%d", &x, &y);
67             if(mapp[x][y]==1);
68             else{
69                 in[y]++;
70                 mapp[x][y] = 1;
71             }
72         }
73         topo();
74     }
75     return 0;
76 }
				
时间: 2025-02-01 04:19:59

SDUT3037--让领导先走(拓扑排序)的相关文章

【Luogu】P3116会议时间(拓扑排序,DP)

题目链接 本题使用拓扑排序来规划DP顺序.设s[i][j]表示i步是否能走到j这个点,e[i][j]表示i步是否能走到j这个点——用第二条路径.因为要满足无后效性和正确性,只有第i个点已经全部更新完毕的时候才能用它来更新其他的点.所以用拓扑. 代码如下 #include<cstdio> #include<cctype> #include<cstring> #include<algorithm> using namespace std; inline long

寒假集训日志(二)——最小生成树,拓扑排序,欧拉回路,连通路

今天学的内容挺多的. (一)首先说最小生成树,两种算法: 1.Kruskal算法( 将边排序,然后再选,关键在于检查是否连通,使用并查集) 2.Prim算法(使用点集,有点类似与最短路的算法) 第一题是并查集算法的使用: A - The Suspects Time Limit:1000MS     Memory Limit:20000KB     64bit IO Format:%I64d & %I64u Submit Status Description 严重急性呼吸系统综合症( SARS),

java实现AOV图的拓扑排序

拓扑排序作为图的应用,了解拓扑排序必须首先了解AOV图. AOV网表示一个有向图中顶点,用弧表示顶点之间的优先关系.如下图所示,在AOV网中,若从顶点vi到顶点vj之间存在一条有向路径,则称顶点vi为顶点vj的前驱,顶点vj为顶点vi的后继.注意,AOV图不能有回路,否则会将序列陷入死循环,称为死锁. 进行拓扑排序,一般步骤如下: <1>在AOV网中选择一个入度为0的顶点 <2>在AOV网中删除此顶点及其相连的有向边 <3>重复步骤<1>和<2>

ZOJ3524Crazy Shopping(完全背包+拓扑排序)经典

H - Crazy Shopping Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Description Because of the 90th anniversary of the Coherent & Cute Patchouli (C.C.P), Kawashiro Nitori decides to buy a lot of rare things

【模拟题(63550802...)】解题报告【贪心】【拓扑排序】【找规律】【树相关】

目录: 1.A[树相关]    2.B[找规律]    3.C[贪心][拓扑排序] A. 描述(A 输入文件 : A.input 输出文件 : A.output)一个城市的构成是一颗n 个节点的树(2 ≤ n ≤ 200), 现在需要在树中找出两条不相交的路径(即两条路径不能有重边也不能有重点),使得路径的长度的乘积最大.输入描述第一行一个数n 表示这个城市一共有 n 个节点.接下来 n-1 行,每行两个数ai 和bi (1 ≤ ai,bi ≤ n ),分别表示从ai 到bi,有一条边,每条边的

POJ 3660Cow Contest(并查集+拓扑排序)

Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7567   Accepted: 4206 Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others

POJ 3249 Test for Job 拓扑排序+DP

http://poj.org/problem?id=3249 题意: 给一个有向无环图DAG(不一定联通),每个点有权值,入度为0的点为起点,出度为0的点为终点,选择一个起点走到一个终点,使得路上的权和最大. 分析: dp[to] = max(dp[from]) + value[to],然后先拓扑排序保证状态正确转移即可,终点做标记,如果是终点则尝试更新答案. update:因为点权可以为负,所以程序里用dp[i] == -1表示未访问过该点是有问题的,不过没有遇上会卡掉这种情况的数据=.= 1

cogs1958 菜肴制作 拓扑排序

链接:http://cogs.pro/cogs/problem/problem.php?pid=1958 题意:给出一些约束条件,要求得出字典序最小的符合所有条件的方案. 这道题很显然是一个在$AOE$上的程序流程问题,显然是一个拓扑排序.但是这个拓扑排序有点意思,因为它要求字典序最小. 那么我们就要找出一种方法,使得最小的出现在最前面,那么我们就考虑用堆维护,倒序建边. 如果我们正序建边,很有可能我们选取了一个点之后再向下走发现了一个更小的点,而且这个更小的点还是可以放在前面的.而如果倒序建边

ASC(22)C(最短路+双连通分量找桥或拓扑排序)

Important Roads Special JudgeTime Limit: 20000/10000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticNext Problem Problem Description The city where Georgie lives has n junctions some of which are connected by bidirectional r