【思维·tarjan·技巧-拓扑确定图中递推顺序】jzoj1238 自行车比赛 纪中集训提高B组

本文主要是介绍【思维·tarjan·技巧-拓扑确定图中递推顺序】jzoj1238 自行车比赛 纪中集训提高B组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits

Description

自行车赛在一个很大的地方举行,有N个镇,用1到N编号,镇与镇之间有M条单行道相连,起点设在镇1,终点设在镇2。

问从起点到终点一共有多少种不同的路线。两条路线只要不使用完全相同的道路就被认为是不同的。

Input

一行两个整数:N和M(1<=N<=10000,1<=M<=100000),表示镇的数量和道路的数量。

接下来M行,每行包含两个不同的整数A和B,表示有一条从镇A到镇B的单行道。

两个镇之间有可能不止一条路连接。

Output

输出不同路线的数量,如果答案超过9位,只需输出最后9位数字。如果有无穷多的路线,输出“inf”。

Sample Input

输入1:
6 7
1 3
1 4
3 2
4 2
5 6
6 5
3 4

输入2:
6 8
1 3
1 4
3 2
4 2
5 6
6 5
3 4
4 3

输入3:
31 60
1 3
1 3
3 4
3 4
4 5
4 5
5 6
5 6
6 7
6 7



28 29
28 29
29 30
29 30
30 31
30 31
31 2
31 2

Sample Output

输出1:
3

输出2:
inf

输出3:
073741824

不全的样例:

31 60 
1 3 
1 3 
3 4 
3 4 
4 5 
4 5 
5 6 
5 6 
6 7 
6 7 
7 8
7 8
8 9
8 9
9 10
9 10
10 11
10 11
11 12
11 12
12 13
12 13
13 14
13 14
14 15
14 15
15 16
15 16
16 17
16 17
17 18
17 18
18 19
18 19
19 20
19 20
20 21
20 21
21 22
21 22
22 23
22 23
23 24
23 24
24 25
24 25
25 26
25 26
26 27
26 27
27 28
27 28
28 29 
28 29 
29 30 
29 30 
30 31 
30 31 
31 2 
31 2 

刚开始考试才读完题目的时候,本来打算放弃这道题来着,因为感觉会不好做,就只写了inf;后来考试时间太多了(没有别的意思啊喂),就尝试着去骗其他分。

大概有一个递推的思路吧:就是递推方案数,这个点的方案数就是他的儿子的方案数之和。我们要保证这个点的答案被他的儿子递推完全才能用他去更新别的点,也就是先算出这个点的入度,被递推一次就入度-- ,然后入度为0就进队去递推别的点。有环的情况特判一下,用-1标记,如果一个点存在一个儿子是-1的话,那么他自己也是-1。
考场代码如下:

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
#include<cstdlib>
using namespace std;
#define N 10005
#define M 100005
#define ll long long
#define INF 0x3f3f3f3f
#define MOD 1000000000
int ind[N];
vector<int>G[N];
int n,m,cnt;
ll ans[N];
void lyt()
{queue<int>Q;while(!Q.empty()) Q.pop();for(int i=1;i<=n;i++)if(!ind[i]){Q.push(i);ans[i]=1;cnt++;}while(!Q.empty()){int u=Q.front();Q.pop();for(int i=0;i<G[u].size();i++){int v=G[u][i];if(ans[v]==-1) continue;if(ans[u]==-1) {ans[v]=-1;if(v==2){puts("inf");exit(0);}}else ans[v]=(ans[v]+ans[u])%MOD;ind[v]--;if(ind[v]==0){if(v==2){if(ans[v]!=-1)printf("%lld\n",ans[v]);else puts("inf");exit(0);}else {Q.push(v);cnt++;}}}}if(cnt<n){puts("inf");exit(0);}
}
int main()
{scanf("%d %d",&n,&m);for(int i=1;i<=m;i++){int u,v;scanf("%d %d",&u,&v);G[u].push_back(v);ind[v]++;}if(ind[1]>0){puts("inf");return 0;}lyt();//puts("inf");return 0;
}

其实我以为我只是骗分而已(骗了30分),评讲的时候没有认真听讲(雾==),只听到说要用什么拓扑排序,然后就去问老师,(听我口述自己算法之后)老师说我的方法就是正解的那个方法,他也不知道为什么挂掉。

经过面向数据编程之后发现: 因为我没有考虑到这2种情况:
1.存在一个环,不在1-2的路径上,我的程序会输出inf
2.如图:

(从数据里面搞下来的,这个图画了好久的说)

简化一下这种情况就是:

(嗯,那个环也可以理解为入度永远不会变成4的东西,或者不看括号里面的内容,我们直接看那个图里面的东西就好,嗯)

用我的递推方法推到3那里就会推不动,因为3的入度不可能为0,但是回想一下我们要求去递推别人的点的入度为0的初衷(保证这个点的答案被递推完全),我们就会发现:指向3的那些点都对答案不可能存在贡献,因为他们都不在1-2的路径上,我们是从1开始递推的,1到达不了的点对答案没有什么影响,所以我们根本就不需要从用那些点来推其他点的答案。(这个开始想的时候想到过,但是没想这么深入,只是觉得1反正也只会递推从1开始能到达的点的答案,就没有管这个问题)

综上,我们得到结论:不在1-2的路径上的点,没有递推的必要。

其实这两个问题都可以用一个方法解决,就是我们只在1-2的路径上的那些点做这个算法就可以了。
具体做法呢,其实可以只从1开始搜,然后搜到的点作为进行递推算法的对象,这样也是可以的;如果非要找到在1-2的路径上的那些点,也可以,从1开始搞一遍,从2开始搞一遍,都可以搜到的点就是在1-2的路径上的那些点。

对了,还有就是取最后9位,由于要保留前导零的缘故,不能直接取模1e9,要特殊处理一下。

大概就可以过了:

这篇关于【思维·tarjan·技巧-拓扑确定图中递推顺序】jzoj1238 自行车比赛 纪中集训提高B组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/692152

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Spring @RequestMapping 注解及使用技巧详解

《Spring@RequestMapping注解及使用技巧详解》@RequestMapping是SpringMVC中定义请求映射规则的核心注解,用于将HTTP请求映射到Controller处理方法... 目录一、核心作用二、关键参数说明三、快捷组合注解四、动态路径参数(@PathVariable)五、匹配请