据说这题正解是floyd???!!!
不管他,虽然我的dij TLE了
就当作是练一练dij
只有50分
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<vector> using namespace std; inline int read(){ int num=0,t=1;char c=getchar(); while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){num=(num<<1)+(num<<3)+c-‘0‘;c=getchar();} return num*t; } const int mn=210,INF=1000000000; struct edge{int t,c;}; vector<edge> g[mn]; typedef pair<int,int> P; int d[mn],n,m,q,ok[mn],t[mn]; void add(int f,int t,int c){ g[f].push_back((edge){t,c}); g[t].push_back((edge){f,c}); } void dij(int s){ priority_queue< P,vector<P>,greater<P> > q; for(int i=0;i<=n;i++)d[i]=INF; d[s]=0;q.push(P(0,s)); while(!q.empty()){ P p=q.top();q.pop(); int x=p.second; if(d[x]<p.first||!ok[x])continue; for(int i=0;i<g[x].size();i++){ edge e=g[x][i]; if(d[e.t]>d[x]+e.c&&ok[e.t]){ d[e.t]=d[x]+e.c; q.push(P(d[e.t],e.t)); } } } } int main() { memset(ok,0,sizeof(ok)); n=read();m=read(); int x,y,z; for(int i=1;i<=n;i++)t[i]=read(); for(int i=1;i<=m;i++){ x=read()+1;y=read()+1;z=read();add(x,y,z); } q=read();int tmp=1; while(q--){ x=read()+1;y=read()+1;z=read(); while(t[tmp]<=z)ok[tmp++]=1; dij(x);printf("%d\n",d[y]==INF?-1:d[y]); } return 0; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。
时间: 2024-11-03 21:50:21