0tps求调
查看原帖
0tps求调
1140118
wanghaolin44243787楼主2024/8/5 10:01
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,z,Q,dis[205][205],o=1,w;
struct node{
	int a,b,c,d;
}tim[205],t,que[50000],ans[205];
vector<node>edge[205];
bool cmp(node x,node y){
	if(x.a!=y.a)return x.a<y.a;
	else if(x.b!=y.b)return x.b<y.b;
	else if(x.c!=y.c)return x.c<y.c;
	else return x.d<y.d;
}
bool via[205];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n;j++){
			dis[i][j]=0x7ffffff;
		}
		dis[i][i]=0;
	}
	for(int i=0;i<n;i++){
		cin>>tim[i].a;
		tim[i].b=i;
	}
	tim[n].a=0x7fffffff;
	tim[n].b=n;
	sort(tim,tim+n,cmp);
	for(int i=1;i<=m;i++){
		cin>>x>>y>>z;
		t.b=z;
		t.a=y;
		edge[x].push_back(t);
		t.a=x;
		edge[y].push_back(t);
	}
	cin>>Q;
	for(int i=1;i<=Q;i++){
		cin>>x>>y>>z;
		que[i].a=z;
		que[i].b=x;
		que[i].c=y;
		que[i].d=i;
	}
	sort(que+1,que+Q+1,cmp);
	for(int i=0;i<n;i++){
		via[tim[i].b]=1;
		for(int j=0;j<edge[tim[i].b].size();j++){
			if(via[edge[tim[i].b][j].a]){
				dis[tim[i].b][edge[tim[i].b][j].a]=edge[tim[i].b][j].b;
				dis[edge[tim[i].b][j].a][tim[i].b]=edge[tim[i].b][j].b;
				for(int k=0;k<n;k++){
					for(int f=0;f<n;f++){
						dis[k][f]=min(dis[k][f],min(dis[k][tim[i].b]+dis[tim[i].b][edge[tim[i].b][j].a]+dis[edge[tim[i].b][j].a][f],dis[f][tim[i].b]+dis[tim[i].b][edge[tim[i].b][j].a]+dis[edge[tim[i].b][j].a][k]));
						dis[f][k]=dis[k][f];
					}
				}
			}
		}
		if(tim[i].a!=tim[i+1].a){
			while(que[o].a<tim[i+1].a){
				ans[o].b=(dis[que[o].b][que[o].c]==0x7ffffff?-1:dis[que[o].b][que[o].c]);
				ans[o].a=que[o].d;
				o++;
			}
		}
	}
	sort(ans,ans+Q,cmp);
	for(int i=1;i<=Q;i++){
		cout<<ans[i].b<<endl;
	}
	return 0;
}
2024/8/5 10:01
加载中...