我不理解为什么每次累加和输出都要取余数
查看原帖
我不理解为什么每次累加和输出都要取余数
1379306
Furinaaaa楼主2024/6/29 10:43

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 ; 

}
2024/6/29 10:43
加载中...