题目链接:https://cn.vjudge.net/problem/Gym-100851F
这道题是POJ-2253的升级版:https://blog.csdn.net/GYH0730/article/details/77510915
在POJ2253的基础上要加上一个点,显然这个点要加在两点的中点处,提前预处理出任意一点到S,到T的所有路径上最大边的最小值,然后我们可以枚举所有的边,答案为min(max(ds[u], w(u,v)/2, dt[v] ),记录一下最小值就行了
细节上要注意边界的处理
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1050;
const double INF = 1e18;
struct Edge
{
int from,to;
double dist;
Edge(int u,int v,double d):from(u),to(v),dist(d) {}
};
struct HeapNode
{
double d;
int u;
HeapNode(int _u,double _d):u(_u),d(_d){}
bool operator < (const HeapNode& rhs) const
{
return d > rhs.d;
}
};
struct Dijkstra
{
int n,m;
vector<Edge> ed