IARCS中NUMROUTE的求解

Solving NUMROUTE in IARCS

本文关键字:NUMROUTE IARCS      更新时间:2023-10-16

问题的链接是(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的遍历次数。

示例:我们有两个节点,01,它们之间有两个连接,ab

   0
  / 
 a   b
   /
   1

邻接矩阵是

0 2
2 0

它的二次方是

4 0 
0 4

实际上,从节点0到节点0:aa, ab, ba, bb有四个长度为2的行走。

以下是一些注意事项。

顺便说一句,你可以使用二进制幂运算非常快速地计算大幂。