相似方法,一个AC一个TLE,求助
查看原帖
相似方法,一个AC一个TLE,求助
1035804
Cgetier01楼主2023/10/6 16:55

第一种方法进floyd函数前每处理一个村庄,将这个点做中转放进函数更新距离;第二种方法是进到floyd1函数里面,然后根据给的时间求可以路过那些村庄,最后一块更新距离,但是会TLE,不知道为什么。

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
#include<queue>
#include<climits>
#include<cstring>
#include<cmath>
#define inf 0x3f3f3f3f
const int N = 210;
int d[N][N], f[N][N], c[N];
int n, m, u, v, w, q;
int x, y, t, ans, pos;

void floyd(int k)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
		}
	}
}


void floyd1()
{
	int num = 0;
	while (c[num] <= t && num < n)//找可以走的村庄
	{
		num++;
	}
	for (int k = 0; k < num; k++)//用可以走的村庄做中转点更新距离
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
			}
		}
	}
}

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++)
		{
			d[i][j] = inf;
		}
		d[i][i] = 0;
	}
	for (int i = 0; i < n; i++)
	{
		cin >> c[i];
	}
	for (int i = 1; i <= m; i++)
	{
		cin >> u >> v >> w;
		d[u][v] = w;
		d[v][u] = w;
	}
	cin >> q;
	for (int i = 1; i <= q; i++)
	{
		cin >> x >> y >> t;
		while (c[pos] <= t && pos < n)//如果目前更新的点的村庄修完时间在询问时间之前
		{
			floyd(pos);
			pos++;
		}
		if (c[x] > t || c[y] > t)//村庄未建好
		{
			cout << -1 << endl;
			continue;
		}
		/*floyd1();*/
		if (d[x][y] != inf)
		{
			cout << d[x][y] << endl;
		}
		else
		{
			cout << -1 << endl;
		}
	}
	return 0;
}
2023/10/6 16:55
加载中...