IARCS中NUMROUTE的求解
Solving NUMROUTE in IARCS
问题的链接是(Docs)尽管我使用下面的代码解决了这个问题,但它将SEG
错误作为len<=10^9
,并且我的程序可能会耗尽堆栈内存。如何优化它?或者有更好的解决方案吗?
#include <iostream>
#include <queue>
#include <stack>
#include <bitset>
#include <vector>
#include <list>
using namespace std;
#define pb push_back
struct nd
{
int val;int times;
};
vector<list<nd> > adj_list;
int end;
int recur(int node, int len)
{ list<nd> ::iterator it;
if(len==1)
{//cout<<"reaching "<<node<<endl;
int y=0;
for(it=adj_list[node].begin(); it!=adj_list[node].end(); it++)
{
if((it->val)==end){y=it->times+y;}
}
return y;
}
else {
int sum=0;
//cout<<"going "<<node<<" length "<<len<<endl;
for(it=adj_list[node].begin(); it!=adj_list[node].end(); it++)
{
sum+=it->times*recur(it->val,len-1);
}
return sum;
}
}
int main()
{
int n;
cin>>n;
adj_list.resize(n);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
int a;cin>>a;
nd temp;
temp.val=j;temp.times=a;
adj_list[i].pb(temp);
}
}
int st,len;
cin>>st>>end>>len;
st--;end--;
list<nd> ::iterator it;
int ans=0;
for(it=adj_list[st].begin(); it!=adj_list[st].end(); it++)
{
int p=it->times*recur(it->val,len-1);
//cout<<*it<<" "<<p<<endl;
ans+=p;
}
cout<<ans%42373<<endl;
}
为多图创建一个邻接矩阵A
,并取其k
次方。得到的矩阵的i,j
项是从节点i
到节点j
的遍历次数。
示例:我们有两个节点,0
和1
,它们之间有两个连接,a
和b
。
0
/
a b
/
1
邻接矩阵是
0 2
2 0
它的二次方是
4 0
0 4
实际上,从节点0到节点0:aa, ab, ba, bb
有四个长度为2的行走。
以下是一些注意事项。
顺便说一句,你可以使用二进制幂运算非常快速地计算大幂。