首页 > 其他分享 >CF1196F K-th Path 题解 floyd

CF1196F K-th Path 题解 floyd

时间:2023-05-23 14:03:49浏览次数:53  
标签:int 题解 短路 d% edge floyd vec 条边 Path

题目链接:https://codeforces.com/problemset/problem/1196/F

题目大意:

给定一个包含 \(n\) 个节点 \(m\) 条边的无向图(\(n,m \le 2 \cdot 10^5\))。

图中任意两点之间(如果连通的话)都存在一条最短路(节点 \(i\) 到它自己不算最短路,\(i\) 到 \(j\) 的最短路 和 \(j\) 到 \(i\) 的最短路视为同一条)。

求:第 \(k\) 小的最短路(\(1 \le k \le 400\))。

解题思路:

如果将 \(m\) 条边按照长度从小到大排,可以发现解决这个问题(求第 \(k\) 小的最短路长度)最多只需要用到最短的 \(\min(k, m)\) 条边。

然后你可以保留最短的 \(\min(k, m)\) 条边,删去剩余的边,然后你会发现最多只剩下 \(2 \min(k, m)\) 的节点是有边连接的 —— 最短路肯定也只包含这些节点。

然后你可以选出这些点然后用 floyd 算法求最短路。

时间复杂度 \(O(m \log m + k^3)\)。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 810, maxm = 2e5 + 5;
struct Edge {
    int u, v, w;

    bool operator < (const Edge &b) const {
        return w < b.w;
    }
} edge[maxm];
int n, m, k, len;
long long dis[maxn][maxn];

int main() {
    scanf("%d%d%d", &n, &m, &k);
    len = min(k, m);
    for (int i = 0; i < m; i++)
        scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w);
    sort(edge, edge+m);
    vector<int> vec;
    for (int i = 0; i < len; i++) {
        vec.push_back(edge[i].u);
        vec.push_back(edge[i].v);
    }
    sort(vec.begin(), vec.end());
    vec.erase(unique(vec.begin(), vec.end()), vec.end());
    n = vec.size();
    memset(dis, 0x3f, sizeof(dis));
    for (int i = 1; i <= n; i++) dis[i][i] = 0;
    for (int i = 0; i < len; i++) {
        int x = lower_bound(vec.begin(), vec.end(), edge[i].u) - vec.begin() + 1;
        int y = lower_bound(vec.begin(), vec.end(), edge[i].v) - vec.begin() + 1;
        dis[x][y] = dis[y][x] = edge[i].w;
    }
    for (int k = 1; k <= n; k++)
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
    vector<long long> ans;
    for (int i = 1; i < n; i++)
        for (int j = i+1; j <= n; j++)
            if (dis[i][j] < 1e15)
                ans.push_back(dis[i][j]);
    sort(ans.begin(), ans.end());
    printf("%lld\n", ans[k-1]);
    return 0;
}

标签:int,题解,短路,d%,edge,floyd,vec,条边,Path
From: https://www.cnblogs.com/quanjun/p/17424466.html

相关文章

  • iOS mask 层 UIBezierPath path 放大
    iOSmask层UIBezierPathpath放大////ViewController.m//test_shapeLayer_02////Createdbyadminon3/4/16.//Copyright©2016jeffasd.Allrightsreserved.//#import"ViewController.h"@interfaceViewController()@property(nonatomic......
  • k8s Error: failed to prepare subPath for volumeMount "custom-logo" of container
    前言使用k8s挂载卷文件时,使用了hostPath,type:FilevolumeMounts:-mountPath:/usr/share/grafana/public/img/grafana_icon.svgname:custom-logosubPath:grafana_icon.svgvolumes:-hostPath:path:/root/test/logo.......
  • JavaScript正则获取a标签中的path路径值-流程引擎-计算引擎
    直接上代码://获取附件中的链接地址functionget_file_path_from_encode_value(x){vararrLink=[];x.replace(/<a[^>]*path=['"]([^'"]+)[^>]*/gi,function(match,capture){arr......
  • JOISC 2022 题解
    JOISC2022Day1监狱Jail首先我们发现操作一定是给所有人排序,然后按照顺序直接从\(s_i\)挪到\(t_i\),要求是对于\(i\),所有在它之前挪的\(t\)不能在\(s_i\tot_i\)上,所有在它之后挪的\(s\)不能在\(s_i\tot_i\)上。有了这个条件我们就可以\(O(n^2)\)建图。但是这样......
  • abc271_e Subsequence Path 题解
    SubsequencePath题意有\(n\)个城市和\(m\)条有向道路,编号从\(1\)开始,第\(i\)条道路从\(a_i\)到\(b_i\),长度为\(c_i\)。给定一个长度为\(k\)的序列\(e\),我们定义从\(1\)到\(n\)的一条路径是优秀的当且仅当:经过的边的编号按顺序构成\(e\)的一个子序列。......
  • Apollo planning 模块(三):path decider
    lanefollow场景为例,包含一个stage,每个stage又包含若干个task。在路径决策方面,依次进行lane_change_decider、path_reuse_decider、path_lane_borrow_decider、path_bounds_decider。在路径优化方面,依次进行piecewise_jerk_path_optimizer、path_assessment_decider、path_decider......
  • NOIP2016普及组试题题解
    1.买铅笔代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intn,ans=1e9,a,b;intmain(){ cin>>n; for(inti=1;i<=3;i++){ cin>>a>>b; ans=min(ans,int(ceil(n*1.0/a)*b)); } cout<<ans; return0;}......
  • CF1770F 题解
    \(\text{link}\)。很困难的二进制计数。前置知识\(1\):范德蒙德卷积推广。即\(\sum\limits_{a_1+a_2+\dots+a_n=k,a_i\in\N}\prod\limits_{j=1}^n\dbinom{b_i}{a_i}=\dbinom{b_1+b_2+\dots+b_n}{k}\)。这里给一个组合意义的证明。\(RHS\)相当于在\(\sumb_i\)个物品中选......
  • Atcoder Beginner Contest ABC302 题解
    代码见此:https://atcoder.jp/contests/abc302/submissions?f.Task=&f.LanguageName=&f.Status=&f.User=frequenter。AAttackhttps://atcoder.jp/contests/abc302/tasks/abc302_a直接计算a/b,有余数的话答案加一。BFindSnukehttps://atcoder.jp/contests/abc302/tasks/abc......
  • NOIP2017普及组试题题解
    1.成绩原题:https://www.luogu.com.cn/problem/P3954代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;inta,b,c;intmain(){ cin>>a>>b>>c; cout<<a/10*2+b/10*3+c/10*5; return0;}解题思路:因为数据保证a,b,c都是10的......