题目描述
自行车赛在一个很大的地方举行,有NNN个镇,用111到NNN编号,镇与镇之间有MMM条单行道相连,起点设在镇111,终点设在镇222。
问从起点到终点一共有多少种不同的路线。两条路线只要不使用完全相同的道路就被认为是不同的。
题目解析
很容易发现111到222的路线中,只要有环,则为INFINFINF。(但实际上这道题有环但并没有INFINFINF这个答案)。
正解是一个tarjantarjantarjan缩点后,拓扑排序即可。
但既然这里没有INFINFINF,那就偷点懒。直接DFSDFSDFS也可以。
代码
#include<bits/stdc++.h>
#define M 1000000000
#define ll long long
using namespace std;
ll n,m;
ll a[10005];
bool flag;
queue<int> q;
int ls[10005],cnt;
struct A
{
int v,next;
}e[100005];
void add(int x,int y){e[++cnt].v=y;e[cnt].next=ls[x];ls[x]=cnt;}
ll dfs(ll x)
{
if(a[x]>=0) return a[x];
a[x]=0;
for(int i=ls[x];i;i=e[i].next)
{
a[x]+=dfs(e[i].v);
if(a[x]>=M) flag=1,a[x]%=M;
}
return a[x];
}
int main()
{
cin>>n>>m;
for(int i=1,u,v;i<=m;i++)
{
cin>>u>>v;
add(v,u);
}
memset(a,-1,sizeof(a));a[1]=1;
dfs(2);
if(flag) printf("%09d",a[2]);
else printf("%d",a[2]);
}