说句闲话,研究C++语法知识的最好方法是
查看原帖
说句闲话,研究C++语法知识的最好方法是
203083
炎炎龙虾楼主2020/10/4 22:08

RE了这题。

我的是Linux环境,C++版本与NOI Linux的一样。编译我的代码出现了没有输出,返回值为139的情况。调了整整一晚上无果,求大佬帮忙。

我以前写矩阵快速幂时从来没有碰到过这种情况。也不太可能是我的C++坏了,在在线IDE上运行随没有RE,但输出了一个非常大的数,反正不是答案。

经过gdb调试,发现错误在operator重载^符号快速幂的那一行,说是找不到变量b的地址,请问这是怎么回事?

//File: P2886.cpp
//Author: yanyanlongxia
//Date: 2020/10/4
//[USACO07NOV]Cow Relays G
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,t,st,ed,num[1000005],tot;
struct matrix
{
    long long a[1005][1005];
    inline void clear()
    {
        memset(a,0x3f3f3f3f, sizeof(a));
    }
    matrix operator * (matrix b)const
    {
        matrix res;
        res.clear();
        for (ll i=1;i<=tot;i++)
            for (ll j=1;j<=tot;j++)
                for (ll k=1;k<=tot;k++)
                    res.a[i][j]=min(res.a[i][j],a[i][k]+b.a[k][j]);
        return res;
    }
    matrix operator ^ (ll b) const
    {
        matrix res,now;
        res.clear();
        now.clear();
        for (ll i=1;i<=tot;i++)
            for (ll j=1;j<=tot;j++)
                now.a[i][j]=a[i][j];
        for (;b;b>>=1ll)
        {
            if (b&1ll)
                res=res*now;
            now=now*now;
        }
        return res;
    }
}base;
int main() {
    ll x,y,z;
    base.clear();
    scanf("%lld %lld %lld %lld",&n,&t,&st,&ed);
    for (ll i=1;i<=t;i++)
    {
        scanf("%lld %lld %lld",&z,&x,&y);
        if (!num[x])
            num[x]=++tot;
        if (!num[y])
            num[y]=++tot;
        x=num[x];
        y=num[y];
        base.a[x][y]=min(base.a[x][y],z);
        base.a[y][x]=min(base.a[y][x],z);
    }
    base=base ^ (n-1);
    printf("%lld\n",base.a[num[st]][num[ed]]);
    return 0;
}

2020/10/4 22:08
加载中...