求助,为什么会超时,我的代码是 O(125n3logT) 的啊
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,T,k,c[550];
struct Node{
int u,v,w;
}edge[510];
bool cmp(Node a,Node b){return a.u==b.u?a.w<b.w:a.u<b.u;}
struct Node2{
int t,x,w;
}req[210];
bool cmp2(Node2 a,Node2 b){return a.t<b.t;}
int cnt;
struct Matrix{ll a[255][255];}A,Graph,G[33],DP[210];
Matrix mul(Matrix a,Matrix b){
Matrix ans;
memset(ans.a,0xD0,sizeof(ans.a));
for(int i=1;i<=cnt;i++){
for(int j=1;j<=cnt;j++){
for(int k=1;k<=cnt;k++){
ans.a[i][k]=max(ans.a[i][k],a.a[i][j]+b.a[j][k]);
}
}
}
return ans;
}
Matrix mul2(Matrix a,Matrix b){
Matrix ans;
memset(ans.a[1],0xD0,sizeof(ans.a[1]));
for(int j=1;j<=cnt;j++){
for(int k=1;k<=cnt;k++){
ans.a[1][k]=max(ans.a[1][k],a.a[1][j]+b.a[j][k]);
}
}
return ans;
}
Matrix pow(Matrix a,ll b){
Matrix ans;
memset(ans.a,0xD0,sizeof(ans.a));
for(int i=1;i<=cnt;i++) ans.a[i][i]=0;
while(b){
if(b&1) ans=mul(ans,a);
b>>=1; a=mul(a,a);
}
return ans;
}
int main(){
for(int i=1;i<=250;i++) A.a[i][i]=1;
scanf("%d%d%d%d",&n,&m,&T,&k);
for(int i=1;i<=n;i++) scanf("%d",&c[i]);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
cnt=n; int cur,len=1;
memset(Graph.a,0xD0,sizeof(Graph.a));
sort(edge+1,edge+m+1,cmp);
for(int i=1;i<=m;i++){
if(edge[i].u!=edge[i-1].u) cur=edge[i].u,len=1;
// printf("%d\n",edge[i].u);
while(edge[i].w>len) Graph.a[cur][++cnt]=0,cur=cnt,len++;
Graph.a[cur][edge[i].v]=c[edge[i].v];
}
for(int i=1;i<=k;i++)
scanf("%d%d%d",&req[i].t,&req[i].x,&req[i].w);
++k; req[k].t=T; req[k].x=0; req[k].w=0;
sort(req+1,req+k+1,cmp2);
for(int i=0;i<=30;i++)
G[i]=pow(Graph,(1<<i));
memset(DP[0].a,0xD0,sizeof(DP[0].a));
for(int i=1;i<=cnt;i++)
DP[0].a[i][i]=c[i];
for(int i=1;i<=k;i++){
DP[i]=DP[i-1];
for(int j=30;j>=0;j--){
if((req[i].t-req[i-1].t)&(1<<j)) DP[i]=mul2(DP[i],G[j]);
}
DP[i].a[1][req[i].x]+=req[i].w;
}
if(DP[k].a[1][1]>=0) printf("%lld",DP[k].a[1][1]);
else printf("-1");
}