24.奇怪的梦境(拓扑排序)

奇怪的梦境(拓扑排序)

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 黄金 Gold

题解

题目描述 Description

Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很多按钮,还有一个屏幕,上面显示了一些信息。屏幕上说,要将所有按钮都按下才能出去,而又给出了一些信息,说明了某个按钮只能在另一个按钮按下之后才能按下,而没有被提及的按钮则可以在任何时候按下。可是Aiden发现屏幕上所给信息似乎有矛盾,请你来帮忙判断。

输入描述 Input Description

第一行,两个数N,M,表示有编号为1...N这N个按钮,屏幕上有M条信息。

接下来的M行,每行两个数ai,bi,表示bi按钮要在ai之后按下。所给信息可能有重复,保证ai≠bi。

输出描述 Output Description

若按钮能全部按下,则输出“o(∩_∩)o”。

若不能,第一行输出“T_T”,第二行输出因信息有矛盾而无法确认按下顺序的按钮的个数。输出不包括引号。

样例输入 Sample Input

3 3

1 2

2 3

3 2

样例输出 Sample Output

T_T

2

数据范围及提示 Data Size & Hint

对于30%的数据,保证0<N≤100。

对于50%的数据,保证0<N≤2000。

对于70%的数据,保证0<N≤5000。

对于100%的数据,保证0<N≤10000,0。

代码如下:

#include

using namespace std;

#include

#define maxn 10001

int p[maxn][maxn],ans[maxn],rudu[maxn],tot=0,n,m,a,b,flag[maxn]={0};

void input();

int topsort();

int main()

{

input();

if(topsort()) printf("o(∩_∩)o");//pai xu chen gong

else {

printf("T_T\n");

printf("%d",n-tot);

}

return 0;

}

void input()

{

scanf("%d%d",&n,&m);

for(int i=1;i<=m;++i)

{

scanf("%d%d",&a,&b);

if(flag[a]==b)

continue;

flag[a]=b;

p[a][0]++;

p[a][p[a][0]]=b;

rudu[b]++;

}

}

int topsort()

{

int t;

while(tot

{

t=0;

for(int i=1;i<=n;++i)

if(!rudu[i])

{

rudu[i]=999999;

t++;tot++;

ans[t]=i;

}

if(t==0) return 0;

for(int i=1;i<=t;++i)

for(int j=1;j<=p[ans[i]][0];++j)

rudu[p[ans[i]][j]]--;

}

return 1;

}

时间: 2024-10-10 23:11:04

24.奇怪的梦境(拓扑排序)的相关文章

【拓扑排序】CODEVS 2833 奇怪的梦境

拓扑排序模板. 1 #include<cstdio> 2 #include<vector> 3 #include<stack> 4 using namespace std; 5 #define N 10001 6 vector<int>G[N]; 7 stack<int>S; 8 int n,m,x,y,ru[N],tot; 9 int main() 10 { 11 scanf("%d%d",&n,&m); 1

浅谈拓扑排序在OI的应用

by MedalPluS [拓扑排序的定义] 引例: 在大学里有很多学科需要学习,而有的学科需要学习其他学科后才能学习,比如说必须先学数学再学微积分......这就是一个拓扑序的关系 [拓扑排序的应用] 对于上述题目,可以假设如果学习a需要学习b的话,从b连一条边到a,然后对整个图求一次拓扑序列,这便是学习的一种方案 很显然,拓扑排序应该从入度为0,然后1,然后2...来找 [拓扑排序的实现] 很容易想到一种算法,暴力枚举每个点,然后找与之相连的点,删掉这条边,并把点的入度-1,再次寻找,知道找

CODEVS——T 2833 奇怪的梦境

http://codevs.cn/problem/2833/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很多按钮,还有一个屏幕,上面显示了一些信息.屏幕上说,要将所有按钮都按下才能出去,而又给出了一些信息,说明了某个按钮只能在另一个按钮按下之后才能按下,而没有被提及的按钮则可以在任何时候按下.可是Aiden发现屏幕上所给信息似乎有矛盾,请你来帮

codevs2833 奇怪的梦境 x

2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很多按钮,还有一个屏幕,上面显示了一些信息.屏幕上说,要将所有按钮都按下才能出去,而又给出了一些信息,说明了某个按钮只能在另一个按钮按下之后才能按下,而没有被提及的按钮则可以在任何时候按下.可是Aiden发现屏幕上所给信息似乎有矛盾,请你来帮忙判断. 输入描述 Input Description 第一

奇怪的梦境(codevs 2833)

题目描述 Description Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很多按钮,还有一个屏幕,上面显示了一些信息.屏幕上说,要将所有按钮都按下才能出去,而又给出了一些信息,说明了某个按钮只能在另一个按钮按下之后才能按下,而没有被提及的按钮则可以在任何时候按下.可是Aiden发现屏幕上所给信息似乎有矛盾,请你来帮忙判断. 输入描述 Input Description 第一行,两个数N,M,表示有编号为1...N这N个按钮,屏幕上有M条信息. 接下来的M行,每行两个数ai,b

2833 奇怪的梦境

2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很多按钮,还有一个屏幕,上面显示了一些信息.屏幕上说,要将所有按钮都按下才能出去,而又给出了一些信息,说明了某个按钮只能在另一个按钮按下之后才能按下,而没有被提及的按钮则可以在任何时候按下.可是Aiden发现屏幕上所给信息似乎有矛盾,请你来帮忙判断. 输入描述 Input Description

codevs 2833 奇怪的梦境

2833 奇怪的梦境 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很多按钮,还有一个屏幕,上面显示了一些信息.屏幕上说,要将所有按钮都按下才能出去,而又给出了一些信息,说明了某个按钮只能在另一个按钮按下之后才能按下,而没有被提及的按钮则可以在任何时候按下.可是Aiden发现屏幕上所给信息似乎有矛盾,请你来帮忙判断. 输入描述 Input Description 第一行,两个数N,M,表示有编号为1...N这N个按钮,屏幕上有M条信息. 接下来的M

逃生(拓扑排序,反向从大到小建图,反向输出)

欢迎参加——每周六晚的BestCoder(有米!) 逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2325    Accepted Submission(s): 655 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的

HDU4857——逃生(反向建图+拓扑排序)

逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有的富.1号最富,2号第二富,以此类推.有钱人就贿赂负责人,所以他们有一些好处.负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推.那么你就要安排大家的顺序.我们保证一