已 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 的小数组还能炸 ?
求教 .