已AC,思路是弗洛伊德,但是是吸氧过的(同一份代码),不开O2会T掉3个点,开了O2A了,但是不知道还有什么可以优化的地方,求教! ps:也许有大佬能讲一下O2优化的原理? 代码在这:
#include<bits/stdc++.h>
using namespace std;
int n,m,b,q;
int cnt,head[10005],x_1,y_1,z_1;
struct bb{
int to,nex,val;
};
bb bian[100005];
int tim[1005],ans[205][205],zan;
void fly(int x,int y,int z){
for(int k=zan;k<n;k++){
if(tim[k]>z){
zan=k-1;
break;
}
for(int i=0;i<n;i++){
if(i==k)continue;
for(int j=0;j<n;j++){
if(j==k)continue;
if(ans[i][k]+ans[k][j]>=0){
ans[i][j]=min(ans[i][j],ans[i][k]+ans[k][j]);
}
}
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>tim[i];
}
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
ans[i][j]=2147483647;
}
ans[i][i]=0;
}
for(int i=1;i<=m;i++){
cin>>x_1>>y_1>>z_1;
ans[x_1][y_1]=ans[y_1][x_1]=z_1;
}
cin>>q;
for(int i=0;i<q;i++){
cin>>x_1>>y_1>>z_1;
if(tim[x_1]<=z_1&&tim[y_1]<=z_1){
if(z_1>=tim[zan+1])fly(x_1,y_1,z_1);
if(ans[x_1][y_1]!=2147483647)cout<<ans[x_1][y_1]<<endl;
else cout<<"-1"<<endl;
}
else cout<<"-1"<<endl;
}
return 0;
}