求助,40分
查看原帖
求助,40分
225301
大珂学家楼主2022/2/24 16:21
#include<bits/stdc++.h>
using namespace std;
const int N=501,oo=0x3f3f3f3f;
int w[N][N],dist[N][N],t[N],n,m,q,last;
void super_floyd(int T)
{
	int k=last;
	for(;t[k]<=T;k++)//将1~n每个结点依次纳入中转进行松弛任意两点 
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(dist[i][j]>dist[i][k]+dist[k][j])
				{
					dist[i][j]=dist[i][k]+dist[k][j];
				}
			}
		}	
	}
	last=k;
}
int main()
{
	memset(w,0x3f,sizeof(w));
	cin>>n>>m;
	for(int i=0;i<n;i++) cin>>t[i];
	for(int i=0;i<n;i++) w[i][i]=0;
	for(int i=0;i<m;i++)
	{
		int u,v,d;
		cin>>u>>v>>d;
		w[u][v]=w[v][u]=d;
	}
	memcpy(dist,w,sizeof(w));//将w数组拷贝给dist 
	cin>>q;
	while(q--)
	{
		int x,y,T;
		cin>>x>>y>>T;
		super_floyd(T);
		if(t[x]>T||t[y]>T) cout<<"-1"<<endl;
		else if(dist[x][y]==oo) cout<<"-1"<<endl;
		else cout<<dist[x][y]<<endl;
	}
	return 0;
}
2022/2/24 16:21
加载中...