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

 

posted @ 2019-07-25 11:44  uid001  阅读(271)  评论(0编辑  收藏  举报