1 条题解

  • 0
    @ 2025-8-24 22:14:31

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar SAMSHAWCRAFT
    疠疫俾惊,荒时殆情。

    搬运于2025-08-24 22:14:31,当前版本为作者最后更新于2024-08-04 10:33:48,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    本题解旨在补充其他题解做法的推理过程。

    注意本题中特别提及了点数是奇数,即 nmod2=1n \bmod 2 = 1,而本图是一个 nn-完全图,即 (n1)(n-1)-正则图,这意味着每个顶点的度数都是 n1n-1,这是一个偶数,不妨设 n1=2in-1=2i,则在这个图的环分割当中,每个顶点都被且仅被 ii 个环通过,且每个环上通过这个顶点的边有且只有 22 条。

    接下来思考如何统计答案,通过前面分析,一个顶点的 2i2i 条边中一定有且只有 ii 条被统计进了答案当中,至于这 ii 条边分别属于哪个环其实并不重要。可以构造性地证明:假设 exe_x 是被统计在答案当中的 ii 条边之一,eye_y 是未被统计在答案当中的 ii 条边之一,只要保证 f(ex,ey)f(e_x,e_y) 就是 exe_x 的边权即可,这样我们就可以把 exe_xeye_y 放进一个环当中而不需担心这两条边具体在哪一个环,因此这个构造转化成下面的问题:给一个长度为 2i2i 的序列 {w}\{w\},要把这个序列分成 ii 对不相交的元组 (wxj,wyj)(w_{x_j},w_{y_j}) 使得 wxjwyjw_{x_j} \ge w_{y_j} 对任意的 j[1,i]j \in [1,i] 成立,求最小化的

    j=1iwxj\sum_{j=1}^i w_{x_j}

    这是一个贪心问题,给序列从小到大排序,然后使 xj=2j,yj=2j1x_j=2j,y_j=2j-1 就可以取得最小值。这样的话本题就完成了,代码如下。

    #include <iostream>
    #include <algorithm>
    #include <vector>
    const int sz=1e3+9;
    int n,m;
    long long ans;
    std::vector<int> edges[sz];
    int main(){
      std::cin.tie(nullptr)->sync_with_stdio(false);
      std::cout.sync_with_stdio(false);
      std::cin>>n;
      m=(n*(n-1))>>1;
      for(int cx=0,u,v,w;cx!=m;++cx){
        std::cin>>u>>v>>w;
        edges[u].push_back(w);
        edges[v].push_back(w);
      }
      for(int cx=1;cx<=n;++cx)
        std::sort(edges[cx].begin(),edges[cx].end());
      for(int cx=1;cx<=n;++cx){
        for(int cy=1;cy!=n;cy+=2)
          ans+=edges[cx][cy];
      }
      std::cout<<ans<<std::endl;
      return 0;
    }
    
    
    • 1

    信息

    ID
    4814
    时间
    2000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者