求助
查看原帖
求助
120947
PurslaneM2GA楼主2022/3/20 17:44

已 AC , 但本地无法运行大样例 . RE

#include<bits/stdc++.h>
#define int long long
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=1000+10,MAXM=200+10;
int n,t,s,e,id[MAXN],lsh[MAXN],idx;
int x[MAXN],y[MAXN],w[MAXN];
struct Matrix {
	int n,m,val[MAXM][MAXM];
	void init(int N,int M) {
		ffor(i,1,N) ffor(j,1,M) val[i][j]=0x3f3f3f3f;
		return n=N,m=M,void();
	}
	void output(void) {
		printf("Matrix Output:\n%lld %lld\n",n,m);
		ffor(i,1,n) {
			ffor(j,1,m) printf("%lld ",val[i][j]);
			printf("\n");
		}
		return ;
	}
};
Matrix unit_matrix(int n) {
	Matrix res;
	res.init(n,n);
	ffor(i,1,n) res.val[i][i]=0;
	return res;
}
Matrix operator *(Matrix A,Matrix B) {
	Matrix res;
	int p,q,r;
    p=q=r=idx;
	res.init(p,r);
	ffor(k,1,q) ffor(i,1,p) ffor(j,1,r) res.val[i][j]=min(res.val[i][j],A.val[i][k]+B.val[k][j]);
	// res.output();
	// exit(0);
	return res;
} 
Matrix operator ^(Matrix A,int p) {
	Matrix base=A,res=A;
	while(p) {
		if(p&1) res=res*base;
		base=base*base,p>>=1;
	}
	return res;
}
signed main() {
	scanf("%lld %lld %lld %lld",&n,&t,&s,&e);
	ffor(i,1,t) {
		scanf("%lld %lld %lld",&w[i],&x[i],&y[i]);
		if(id[x[i]]==0) id[x[i]]=++idx,lsh[idx]=x[i];
		if(id[y[i]]==0) id[y[i]]=++idx,lsh[idx]=y[i];
	}
	Matrix A;A.init(idx,idx);
//	ffor(i,1,idx) A.val[i][i]=0;
	ffor(i,1,t) A.val[id[x[i]]][id[y[i]]]=A.val[id[y[i]]][id[x[i]]]=w[i];
	// cout<<idx;return 0;
	A=A^(n-1);
	// A.output();
	cout<<A.val[id[s]][id[e]];
	return 0;
}

有人说数组过大 . 这一个 200*200 的小数组还能炸 ?

求教 .

2022/3/20 17:44
加载中...