K-th Path CodeForces - 1196F (最短路)
大意: 给定无向连通图, 求任意两点间第$k$小的最短路.
$k$比较小, 那么答案一定不超过第$k$大边权, 取前$k$大边跑$floyd$即可.
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <map>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;
typedef long long ll;
const int N = 2e5+10, M = 1e3+10;
int n,m,k,tot;
struct _ {int x,y,w;}a[N];
ll d[M][M],b[N];
map<int,int> s;
int ID(int x) {
if (s.count(x)) return s[x];
return s[x]=++tot;
}
int main() {
cin>>n>>m>>k;
REP(i,1,m) cin>>a[i].x>>a[i].y>>a[i].w;
sort(a+1,a+1+m,[](_ a,_ b){return a.w<b.w;});
memset(d,0x3f,sizeof d);
REP(i,1,tot) d[i][i]=0;
REP(i,1,min(m,k)) {
d[ID(a[i].x)][ID(a[i].y)]=d[ID(a[i].y)][ID(a[i].x)]=min(d[ID(a[i].x)][ID(a[i].y)],(ll)a[i].w);
}
REP(k,1,tot) REP(i,1,tot) REP(j,1,tot) {
d[i][j] = min(d[i][j],d[i][k]+d[k][j]);
}
REP(i,1,tot) REP(j,i+1,tot) b[++*b]=d[i][j];
sort(b+1,b+1+*b);
printf("%lld\n",b[k]);
}

浙公网安备 33010602011771号