题目链接:https://vjudge.net/problem/CodeForces-1196F
题意:从图中找出第K短的最短路,最短路:从一个点到另一个的最短距离。
思路:题目说了,每两个点之间的边小于等于1,那么如果我们只取K条边,
那么顶点数 V∈[K,2K],所以我们一定可以在K条边中的到第K短的最短路。
当然我们先要把所有变来一个sort,取权值小的K条边。
之后跑一个floyd就可以了,然后把所有最短路存下来,找出第K小的最短路。
ps(这里的编号很方便,我是参考另一个大佬的,这里说明一下,当然也可以和我之前一样,
来个计数的慢慢编号)。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 #include <map> 7 #include <cmath> 8 #include <iomanip> 9 using namespace std; 10 11 typedef long long LL; 12 #define inf (1LL << 60) 13 #define rep(i,j,k) for(int i = (j); i <= (k); i++) 14 #define rep__(i,j,k) for(int i = (j); i < (k); i++) 15 #define per(i,j,k) for(int i = (j); i >= (k); i--) 16 #define per__(i,j,k) for(int i = (j); i > (k); i--) 17 18 const int N = (int)2e5 + 10; 19 LL tmp[N]; 20 LL dis[810][810]; 21 int n,m,k; 22 map<int, int> s; 23 int tot; 24 25 struct node{ 26 int u; 27 int v; 28 int w; 29 30 bool friend operator < (node a,node b){ 31 return a.w < b.w; 32 } 33 34 }o[N]; 35 36 int ID(int x){ 37 if(s.count(x)) return s[x]; 38 return s[x] = ++tot; 39 } 40 41 int main(){ 42 43 ios::sync_with_stdio(false); 44 cin.tie(0); 45 46 cin >> n >> m >> k; 47 48 int u,v,w,l = 0; 49 //存边 50 rep(i,1,m){ 51 cin >> u >> v >> w; 52 o[l].u = u; 53 o[l].v = v; 54 o[l++].w = w; 55 } 56 //sort边,取前K条 57 sort(o,o + m); 58 59 rep(i,1,805) rep(j,1,805){ 60 if(i == j) dis[i][j] = 0; 61 else dis[i][j] = inf; 62 } 63 64 //建图 65 rep__(i,0,min(m,k)){ 66 dis[ID(o[i].u)][ID(o[i].v)] = dis[ID(o[i].v)][ID(o[i].u)] = o[i].w; 67 } 68 69 rep(k,1,tot) rep(i,1,tot) rep(j,1,tot){ 70 dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]); 71 } 72 73 l = 0; 74 rep(i,1,tot) rep(j,i + 1,tot){ 75 tmp[l++] = dis[i][j]; 76 } 77 78 sort(tmp, tmp + l); 79 80 cout << tmp[k - 1] << endl; 81 82 getchar();getchar(); 83 84 return 0; 85 }