JZOJ 1238. 自行车比赛

题目

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 
 

Data Constraint

分析

 

  • tarjan+拓扑,然后没有环的数据?
  • 直接拓扑?打爆了然后80不知道哪里错了
  • 记忆化搜索过了?

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<cstring>
 5 #define LL long long
 6 using namespace std;
 7 const LL N=1e4;
 8 const LL MOD=1e9;
 9 LL n,m,f[N+10];
10 bool flag;
11 vector<LL>g[N+10];
12 LL dfs(LL u)
13 {
14     if(f[u]>=0) return f[u];
15     f[u]=0;
16     for(LL i=0;i<g[u].size();i++)
17     {
18         LL v=g[u][i];
19         f[u]+=dfs(v);
20         if(f[u]>=MOD) f[u]%=MOD,flag=1;
21     }
22     return f[u];
23 }
24 int main()
25 {
26     scanf("%lld%lld",&n,&m);
27     for(LL i=1,u,v;i<=m;i++) scanf("%lld%lld",&u,&v),g[v].push_back(u);
28     memset(f,-1,sizeof(f));
29     f[1]=1;
30     dfs(2);
31     if(!flag){printf("%lld",f[2]);return 0;}
32     LL x=1e8;
33     while(x)
34     {
35         printf("%lld",f[2]/x);
36         f[2]%=x;
37         x/=10;
38     }
39     return 0;
40 }

 

猜你喜欢

转载自www.cnblogs.com/zjzjzj/p/11333058.html