牛客算法周周练18E

在这里插入图片描述在这里插入图片描述

题目大意:

给出n个节点和m条路线,对于接下来的m 行,每行输入a b c 表示a b 之间有一条权值为c的路,你的任务是从 1 走到 n,每次你只能走权值 <= ans 的路,输出最小的ans值。

解题思路:

首先注意一下多组输入,然后地图200 * 200, Floyd水过去就好了,改一下路径松弛的过程即可。

Code:

#pragma GCC optimize(2)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cstring>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 250;
const int inf = 0x3f3f3f3f;
int mp[N][N];
int n, m;
int main()
{
	ios::sync_with_stdio(false);
	while (cin >> n >> m)
	{
		for (int i = 1;  i <= n; i ++)//每次先初始化
			for (int j = 1; j <= n; j ++)
				mp[i][j] = (i == j) ? 0 : inf;
		for (int i = 1; i <= m; i ++)
		{
			int a, b, c;
			cin >> a >> b >> c;
			mp[a][b] = min(mp[a][b], c);
		}
		for (int k = 1; k <= n; k ++)
			for (int i = 1; i <= n; i ++)
				for (int j = 1; j <= n; j ++)
					mp[i][j] = min(mp[i][j], max(mp[i][k], mp[k][j]));//这里改一下即可
		cout << mp[1][n] << endl;
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Hayasaka/p/14294160.html