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;
}