//P2886
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 110;
int n, t, s, e, tot = 0, sum = 0;
int num[100010];
struct Matrix{
int a[N][N];
Matrix(int op){
memset(a, 0, sizeof(a));
if(op == 1) for(int i = 1; i <= tot; ++ i) a[i][i] = 1;
if(op == 0x3f) memset(a, 0x3f, sizeof(a));
}
Matrix operator * (const Matrix &b) const {
Matrix c(0x3f);
for(int i = 1; i <= tot; ++ i)
for(int j = 1; j <= tot; ++ j)
for(int k = 1; k <= tot; ++ k)
c.a[i][j] = min(c.a[i][j], a[i][k] + b.a[k][j]);
return c;
}
};
int main(){
scanf("%d%d%d%d", &n, &t, &s, &e);
Matrix Edge(0x3f), Ans(1);
for(int i = 1; i <= t; ++i){
int u, v, w; scanf("%d%d%d", &w, &u, &v);
if(!num[u]) num[u] = ++tot;
if(!num[v]) num[v] = ++tot;
Edge.a[num[u]][num[v]] = Edge.a[num[v]][num[u]] = w;
}
n--, Ans = Edge;//这句话加上AC,不加WA
while(n){
if(n & 1) Ans = Ans * Edge;
Edge = Edge * Edge, n >>= 1;
}
printf("%d\n", Ans.a[num[s]][num[e]]);
return 0;
}
rt
正常矩阵快速幂完全可以把ans数组初始化为单位矩阵,不用n--
可是我的代码这样写wa,加上 n--, Ans = Edge; 才ac
为什么?