TLE求调(就是Floyd呀!)
查看原帖
TLE求调(就是Floyd呀!)
1050431
DevilsFlame楼主2024/8/1 17:34
#include<bits/stdc++.h>
using namespace std;
int n,m,q,a,b,l,t[205],w,top,v;
int f[205][205];
struct Node{
	int a,b,l,m;
}e[40000];
void fl()//Floyd(保证在规定时间内——具体见下)
{
	for(int k = 0;k < n;k ++)
		for(int i = 0;i < n;i ++) if(f[i][k] != v)
			for(int j = 0;j < n;j ++) if(f[k][j] != v)
				f[i][j] = min(f[i][k] + f[k][j],f[i][j]);
}
bool cmp(Node x,Node y)
{
	return x.m < y.m;
}
inline void read(int &x)
{
	x = 0;
	int f = 1;
	char s = getchar();
	while(s < '0' || s > '9')
	{
		if(s == '-') f = -1;
		s = getchar();
	}
	while(s >= '0' && s <= '9')
	{
		x = x * 10 + s - 48;
		s = getchar();
	}
	x *= f;
	return;
}
int main()
{
    ios::sync_with_stdio(0);
	memset(f,0x3f3f3f,sizeof(f));
	v = f[1][1];
	read(n),read(m);
	for(int i = 0;i < n;i ++)
	{
		read(t[i]);
		f[i][i] = 0;
	}
	for(int i = 1;i <= m;i ++)
	{
		read(e[i].a),read(e[i].b),read(e[i].l);
		e[i].m = max(e[i].a,e[i].b);
	}
	sort(e + 1,e + 1 + m,cmp);//给时间排序
	read(q);
	top ++;
	while(q --)
	{
		read(a),read(b),read(w);
		while(t[e[top].m] <= w && top <= m)//在所在时间范围内
		{
			f[e[top].a][e[top].b] = f[e[top].b][e[top].a] = e[top].l;
			top ++;
		}
		fl();
		if(f[a][b] == v) cout << -1 << endl;
		else cout << f[a][b] << endl;
	}
	return 0;
}
2024/8/1 17:34
加载中...