1. 程式人生 > >多源最短路+Floyd真香【洛谷P1119】

多源最短路+Floyd真香【洛谷P1119】

傳送門:https://www.luogu.org/problemnew/show/P1119

我:這什麼辣雞演算法啊,O(n^3)能用?敲dijkstra啊!

我:?TLE???

:寫個Floyd啊!

我:我才不寫這個垃圾O(n^3)

評測雞:Accepted!

我:哎呦真香。

這題用dijkstra每次跑一遍,第一次50分,改了改scanf,跑了60分,改了改printf,開了O2,跑了80分,改了改memset,還是80分,看來dijkstra到頭了...

這題是q次詢問,而且是多源最短路,而且每次詢問的時間都是遞增的,所以那就直接Floyd就好啦。

哎呦真香。


Floyd大家肯定都會吧,大概就是DP思想。

上程式碼:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 210;
const int INF = 1e9+7;
int d[maxn][maxn];
int t[maxn];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,m;
	cin>>n>>m;
	memset(d,0x7f,sizeof(d));
	for(int i=0;i<n;i++)
	{
		cin>>t[i];
	}
	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=1;i<=m;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		d[x][y] = z;
		d[y][x] = z;
	}
	int q;
	int p = 0;
	cin>>q;
	for(int i=0;i<q;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		for(;t[p]<=z && p<n;p++)
		{
			for(int i=0;i<n;i++)
			{
				for(int j=0;j<n;j++)
				{
					d[i][j] = min(d[i][j],d[i][p]+d[p][j]);
				}
			}
		}
		if(t[x]>z || t[y]>z || d[x][y]>=INF) cout<<"-1"<<endl;
		else cout<<d[x][y]<<endl;
	}
	return 0;
}