AC代码如下: 但请问各路大神,为什么在输出最后答案和每次更新路径数时,都要取余数呢?两者只要有一个没取余数就是40,我不理解
using namespace std ;
#include <iostream>
#include <queue>
#include <vector>
typedef unsigned long long U ;
U n , m ;
//记录入度
U innum[6666] ;
//记录出度
U outnum[6666];
//存图
typedef struct bian
{
U to ; //指向哪个节点
U last ; //上一条同一个起点的边的编号
}E;
//记录每一条边的编号
E edges[500500] ;
//记录目前加到了第几条边
U num = 0 ;
//heads[i]记录以i为起点的最新一条边
U heads[6666] ;
//加边函数
void add_edge(U start, U to )
{
edges[num].to = to ;
edges[num].last = heads[start] ;
heads[start] = num ;
num += 1 ;
}
//记录路径数
U ans[1000000] ;
//结构体,传递编号和累计链长
typedef struct jadi
{
U id ;
U len = 0 ;
}P;
int main()
{
U k = 80112002 ;
cin >> n >> m ;
//初始化innum和head
for (U i = 0; i <= n + 12 ; i++)
{
innum[i] = 0 ;
heads[i] = -1 ;
outnum[i] = 0 ;
ans [i] = 0 ;
}
//存图
for (U _ = 0; _ < m; _++)
{
U start , to ;
cin >> to >> start ;
//增加入度,出度
innum[to] += 1 ;
outnum[start] += 1 ;
//加边
add_edge( start , to ) ;
}
//队列存储待搜索节点
queue < P > q1 ;
//将所有入度为0的点加入待搜索队列
for (U i = 1; i <= n; i++)
{
if (innum[i] == 0)
{
P px ;
px.id = i ;
ans[i] = 1 ;
q1.push( px ) ;
}
}
//搜索
while (! q1.empty() )
{
//cout << "----------------------------" << endl ;
//获取首节点
P p0 ;
p0 = q1.front() ;
q1.pop() ;
//cout << "当前是节点:" << p0.id << endl ;
//遍历所有子节点,将入度为0的加入待搜索队列
for (U i = heads[p0.id]; i != -1; i = edges[i].last)
{
//入度先减一
innum[edges[i].to] -= 1;
//更新路径数
ans[ edges[i].to ] = ( ans[edges[i].to] + ans[p0.id ] ) % k;
//如果出度为0,说明没有子节点,结算
if (outnum[edges[i].to] == 0)
{
continue ;
}
//出度不为0,继续
//看看入度是不是0,是0则加入待搜索队列
if (innum[edges[i].to] == 0)
{
P px ;
px.id = edges[i].to ;
q1.push(px) ;
//cout << "这个点" << edges[i].to << "入度为0,加入队列;其所承载链长为:" << px.len << endl ;
}
}
}
U nums = 0 ;
for (U i = 1; i <= n; i++)
{
if (outnum[i] == 0)
{
nums += ans[i] ;
}
}
cout << nums % k ;
return 0 ;
}