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]); }