E. Lost in WHU。矩阵快速幂!

本文介绍了一道竞赛题的解决方法,该题要求计算从起点到终点的不同路径数量。通过建立图的邻接矩阵并利用矩阵快速幂运算,有效地解决了问题。文章提供了完整的代码实现。

                                                                     E. Lost in WHU

  比赛的时候一直不知道样例怎么来的,然后和队友推了一下,然后还是没什么思路,样例手推很困难,然后我随口枚举了几个算法dp、广搜、快速幂。比赛结束问了谷队长结果真的是用快速幂写。

 题意:n个点,m条边,每一步可以从一个点走到与其相连的点上,求如果最多可以走T步,1到n有多少种走法。

 思路:裸的矩阵快速幂,初始矩阵在输入的时候连的双向边,表示可走,但要注意从n出发的话只有单向边,题目说明走到n号节点就不能走出去了。n到n也要连一条边。然后求这个矩阵的T次方,结果就是第一行第n列的值。

int n,m,t;
struct matrix
{
    ll a[101][101];
};
matrix mul(matrix A,matrix B)
{
   matrix res;
   memset(res.a,0,sizeof(res.a));
   for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    for(int k=1;k<=n;k++)
    res.a[i][j]=(res.a[i][j]+A.a[i][k]*B.a[k][j])%MOD;
  return res;
}
matrix mul_pow(matrix A)
{
   matrix res;
   memset(res.a,0,sizeof(res.a));
   for(int i=1;i<=n;i++) res.a[i][i]=1;
   while(t)
   {
       if(t&1) res=mul(res,A);
       A=mul(A,A);
       t>>=1;
   }
   return res;
}
void solve()
{
    int u,v;
    matrix res;
    for(int i=0; i<m; i++)
    {
        scanf("%d%d",&u,&v);
        if(u==n) res.a[v][u]=1;
        else if(v==n) res.a[u][v]=1;
        else res.a[u][v]=res.a[v][u]=1;
    }
    res.a[n][n]=1;
    scanf("%d",&t);
    res=mul_pow(res);
    printf("%lld\n",res.a[1][n]);
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        solve();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值