为什么矩阵快速幂时不能初始为单位矩阵
查看原帖
为什么矩阵快速幂时不能初始为单位矩阵
390770
D2T1xubiaoshi楼主2021/8/29 12:57
//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

为什么?

2021/8/29 12:57
加载中...