十五届山东ccpc省赛补题(update)

纯菜鸡只写出了两题,菜完了,不想当分母呀TAT

H. Minimum Spanning Tree

自己能思考到的:最小生成树的唯一性

不能思考到:只有i和i-1才有必要被新添加进去,将原本的图的边进行排序,代价为0或者1的必然不会更优了,所以能加就加,至少要加n-1-k条,若为01则加到不能加为止,先跑对有限的边一遍**克鲁斯卡尔,**然后再用最优的加边方式(i和i+1)加到整个图联通(n-1条),最后输出答案即可

上代码:

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define endl '\n'
using namespace std;
typedef pair<int,int>pii;
const int N=5e5+10;
int p[N];
struct nod{
    int u,v,w,id;
    bool operator<(const nod& b)const{
        return w<b.w;
    }
};
int find(int x){
    if(x==p[x]) return x;
    return p[x]=find(p[x]);
}
bool merge(int a,int b){
    int x=find(a),y=find(b);
    if(x==y) return 0;
    p[y]=x;
    return 1;
}
void solve(){
    int n,m,k;cin>>n>>m>>k;
    for(int i=1;i<=n;i++) p[i]=i;
    vector<nod>edg(1);
    for(int i=1;i<=m;i++){
        int u,v,w;cin>>u>>v>>w;
        edg.push_back({u,v,w,i});
    }
    sort(edg.begin()+1,edg.end());
    vector<nod>res;
    int ans=0,cnt=0;
    int must=n-1-k;
    for(int i=1;i<=m&&cnt<n-1;i++){
        auto [u,v,w,id]=edg[i];
        if(w<=1){
            if(merge(u,v)){
                cnt++;
                ans+=w;
                res.push_back(edg[i]);
            }
            continue;
        }
        if(cnt>=must){
            break;
        }
        if(merge(u,v)){
            cnt++;
            ans+=w;
            res.push_back(edg[i]);
        }
    }
    vector<nod>add;
    int idx=m+1;
    int ad=0;
    for(int i=1;i<=n-1;i++){
        if(cnt==n-1) break;
        if(ad==k) break;
        if(merge(i,i+1)){
            cnt++;
            ad++;
            ans+=1;
            add.push_back({i,i+1,1,idx});
            idx++;
        }
    }
    cout<<ad<<endl;
    for(auto [u,v,w,id]:add){
        cout<<u<<" "<<v<<endl;
    }
    cout<<ans<<endl;
    for(auto [u,v,w,id]:res){
        cout<<id<<" ";
    }
    for(auto [u,v,w,id]:add){
        cout<<id<<" ";
    }
}
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    int T=1;cin>>T;
    while(T--){
        solve();cout<<endl;
    }
}
相关推荐
布莱克6054 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
ZhengEnCi5 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是6 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考6 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
沫璃染墨8 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
nm_zfyjt8 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
xiaoye-duck10 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
w_zero_one10 小时前
算法--构造
java·数据结构·算法
其实防守也摸鱼10 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
旖旎夜光11 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习