rt,p1119虽然用floyd过了但还是想看看这代码能不能剪枝过:
#include<bits/stdc++.h>
#pragma GCC opttimes(0)
using namespace std;
struct edge{
int v,w;
};
struct node{
int dis,u;
bool operator>(const node& a)const{
return dis>a.dis;
}
};
vector<edge>a[10005];
int dis[10005];
int t[10005];
bool vis[10005];
priority_queue<node,vector<node>,greater<node>>q;
int n,m,s;
int dijsktra(int x,int y,int tt){
memset(dis,0x3f3f,sizeof(dis));
memset(vis,0,sizeof(vis));
q.push({0,x});
dis[x]=0;
while(!q.empty()){
int u=q.top().u;
q.pop();
if(vis[u]||t[u]>tt)continue;
vis[u]=1;
for(auto ed:a[u]){
int v=ed.v,w=ed.w;
if((dis[v]>dis[u]+w)&&t[v]<=tt&&t[u]<=tt){
dis[v]=dis[u]+w;
q.push({dis[v],v});
}
}
}
if(dis[y]>=0x3f3f)return -1;
else return dis[y];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>t[i];
}
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
u++,v++;
a[u].push_back({v,w});
a[v].push_back({u,w});
}
int qq;
cin>>qq;
for(int i=1;i<=qq;i++){
int x,y,tt;
cin>>x>>y>>tt;
x++,y++;
cout<<dijsktra(x,y,tt);
}
return 0;
}
```cpp