题目
Description
自行车赛在一个很大的地方举行,有N个镇,用1到N编号,镇与镇之间有M条单行道相连,起点设在镇1,终点设在镇2。
问从起点到终点一共有多少种不同的路线。两条路线只要不使用完全相同的道路就被认为是不同的。
问从起点到终点一共有多少种不同的路线。两条路线只要不使用完全相同的道路就被认为是不同的。
Input
第一行两个整数:N和M(1<=N<=10000,1<=M<=100000),表示镇的数量和道路的数量。
接下来M行,每行包含两个不同的整数A和B,表示有一条从镇A到镇B的单行道。
两个镇之间有可能不止一条路连接。
接下来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 }