牛客练习赛74 CCA的图(并查集贪心)

CCA的数列

https://ac.nowcoder.com/acm/contest/9700/A

本来不算裸题,但是这个数据范围提示的太明显了

先对边按照编号排序

先保证最大

那么我们的边从一直并查集合并,一旦连通就停下来

那么这个一定是最大的

现在我们要求最小

那我们把并查集数组再次初始化,按顺序加边

一旦连通就停下来,此时是最小的

正确性显然....(不显然可以留言)

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
struct edge{
    int l,r,w;
    bool operator < (const edge&tmp )    const{
        return w<tmp.w;
    }
}a[maxn*3];
int n,pre[maxn],m,s,t,ansl,ansr;
int find(int x){ return x==pre[x]?x:pre[x]=find(pre[x]);}
void join(int q,int w)
{
    pre[find(q)] = find(w);
}
int main()
{
    cin >> n >> m >> s >> t;
    for(int i=1;i<=n;i++)    pre[i] = i;
    for(int i=1;i<=m;i++)
        scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].w);
    sort( a+1,a+1+m );
    for(int i=m;i>=1;i--)
    {
        int l = a[i].l, r = a[i].r;
        join(l,r);
        if( find(s)==find(t) )
        {
            ansl = i;
            break;
        }
    }
    for(int i=1;i<=n;i++)    pre[i] = i;
    for(int i=ansl;i<=m;i++)
    {
        int l = a[i].l, r = a[i].r;
        join(l,r);
        if( find(s)==find(t) )
        {
            ansr = i;
            break;
        }        
    }
    cout << a[ansl].w << " " << a[ansr].w;
}
全部评论
这个数据我还怕300万条边排个序会TLE。。。
点赞 回复 分享
发布于 2020-12-21 20:35
我也怕,但是时限给了2s hhhhh
点赞 回复 分享
发布于 2020-12-21 20:42

相关推荐

已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
研一开学九月份速成的Java,项目是苍穹外卖和黑马点评,算法基础不好,八股文较为熟练,想找份小厂日常实习,希望牛友们给点意见,蟹蟹啦
求offer的花生米很聪敏:三个月学了这么多?spring springmvc mybatis springboot jvm juc,还做完了两个项目,还熟悉八股,会点算法。卧槽,我该反思了。我暑假开始的,就做了外卖,spring springmvc boot 那些原理好多都忘了,还在刷 jvm 视频,八股和算法也没开始
点赞 评论 收藏
分享
评论
5
收藏
分享
牛客网
牛客企业服务