CodeForces - 1081D Maximum Distance (最小生成树)

🐗 🐗 🐗

题意有些晦涩难懂。。。
(1)给出一张图,存在自环和重边,但是最终有贡献的边是两点之间的最短路(就是一张图的最小生成树
(2)对于每个特殊点,求他到其他特殊点的路径上最长的一条边
对答案可能有贡献的边一定两边都有特殊点(从树上来看),这样我们找到所有这样的边,然后找到其中最大的就是答案,因为对于每个特殊点,我们总是可以取到改边另一侧的特殊点从而达到这个答案
(3)考虑做最小生成树的时候怎么判断该边是否符合要求。回忆做Kru的过程,把所有边排序,每次加边时连通两个连通块,直到只剩下一个连通块为止。假设我们最终要求的答案边为a,那么做最小生成树轮到a边的时候,必定能将所有特殊点连接起来(因为a是任意两个特殊点之间路径的最长边),保证不会出现失配情况。

int f[MX];
int tag[MX];//记录某连通块是否存在关键点
int find(int x)
{
    return x==f[x]?x:f[x]=find(f[x]);
}
vector<pair<int,pii> >edges;
signed main()
{
    int n,m,k;cin>>n>>m>>k;
    rpp(i,n) f[i]=i;
    rpp(i,k) 
    {
        int x;cin>>x;
        tag[x]=1;
    }
    rpp(i,m) 
    {
        int u,v,w;cin>>u>>v>>w;
        edges.push_back(make_pair(w,make_pair(u,v)));
    }
    sort(all(edges));
    int ans=0;
    for(auto i:edges)
    {
        int fx=find(i.second.first),fy=find(i.second.second),w=i.first;
        if(fx!=fy)
        {
            if(tag[fx]&&tag[fy]) ans=max(ans,w);
            tag[fx]|=tag[fy];
            f[fy]=fx;
        }
    }
    rpp(i,k) cout<<ans<<" ";
    cout<<endl;
    stop;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CodeForces - 616D是一个关于找到一个序列中最长的第k好子段的起始位置和结束位置的问题。给定一个长度为n的序列和一个整数k,需要找到一个子段,该子段中不超过k个不同的数字。题目要求输出这个序列最长的第k好子段的起始位置和终止位置。 解决这个问题的方法有两种。第一种方法是使用尺取算法,通过维护一个滑动窗口来记录\[l,r\]中不同数的个数。每次如果这个数小于k,就将r向右移动一位;如果已经大于k,则将l向右移动一位,直到个数不大于k。每次更新完r之后,判断r-l+1是否比已有答案更优来更新答案。这种方法的时间复杂度为O(n)。 第二种方法是使用枚举r和双指针的方法。通过维护一个最小的l,满足\[l,r\]最多只有k种数。使用一个map来判断数的种类。遍历序列,如果当前数字在map中不存在,则将种类数sum加一;如果sum大于k,则将l向右移动一位,直到sum不大于k。每次更新完r之后,判断i-l+1是否大于等于y-x+1来更新答案。这种方法的时间复杂度为O(n)。 以上是两种解决CodeForces - 616D问题的方法。具体的代码实现可以参考引用\[1\]和引用\[2\]中的代码。 #### 引用[.reference_title] - *1* [CodeForces 616 D. Longest k-Good Segment(尺取)](https://blog.csdn.net/V5ZSQ/article/details/50750827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Codeforces616 D. Longest k-Good Segment(双指针+map)](https://blog.csdn.net/weixin_44178736/article/details/114328999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值