80分TLE求助!
查看原帖
80分TLE求助!
641163
abensyl楼主2022/7/30 09:25
#include<bits/stdc++.h>

using namespace std;

const int N=507;
int n,m;
bool done[N];
int tim[N];
int dis[N];
int hd[N];
using pdi=pair<int,int>;

inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9') { if (ch=='-') f=-1;ch=getchar(); }
	while (ch>='0'&&ch<='9') { x=x*10+ch-48;ch=getchar(); }
	return x*f;
}
inline void write(int x){
    if(x<0){putchar('-');x=-x;}
    if(x>9)write(x/10);
    putchar(x%10+'0');
}

struct edge{
  int wt;
  int to,nx;
  int usif;
} eg[70000];
void addE(int u,int v,int w,int c){
  eg[c].nx=hd[u],hd[u]=c,eg[c].to=v,eg[c].wt=w,eg[c].usif=max(tim[u],tim[v]);
}

void dijkstra(int s,int t,int e) {
  if(tim[s]>t||tim[e]>t) return;
  dis[s]=0;
  priority_queue<pdi> pque;
  pque.emplace(0,s);
  while(pque.size()) {
    pdi pu=pque.top();
    pque.pop();
    int u=pu.second;
    int du=-pu.first;
    if(u==e) return;
    if(done[u]) continue;
    done[u]=true;
    for(int i=hd[u];i;i=eg[i].nx) {
    	if(eg[i].usif>t) continue;
      int to=eg[i].to;
      int w=eg[i].wt;
      if(dis[to]>w+du) {
        dis[to]=w+du;
        pque.emplace(-dis[to],to);
      }
    }
  }
}

int main() {
  n=read(),m=read();
  for(int i=0;i<n;++i) cin>>tim[i];
  for(int k=1,i,j,w;k<=m;++k) {
  	i=read(),j=read(),w=read();
  	addE(i,j,w,k<<2);
  	addE(j,i,w,k<<2|1);
	}
	int q;
	q=read();
	for(int i=0;i<q;++i) {
		int x,y,t;
		x=read(),y=read(),t=read();
		memset(dis,0x3f,sizeof(dis));
		memset(done,0,sizeof(done));
		dijkstra(x,t,y);
		if(dis[y]>=100000000) putchar('-'),putchar('1'),putchar('\n');
		else write(dis[y]),putchar('\n');
	}
  return 0;
}
2022/7/30 09:25
加载中...