牛客周赛 Round 145-E(写了200行的史山)

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define endl '\n'
using namespace std;
const int mod=998244353;
typedef pair<int,int>pii;
const int N=3e5+10;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int num[N],inv[N];//阶乘以及阶乘的逆元
//ans=num[a]*inv[a-b]%mod*inv[b]%mod;
int kmi(int a,int b){
    int res=1;
    while(b){
        if(b&1)res=res*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return res;
}

void init(){
    num[0]=1,inv[0]=1;
    for(int i=1;i<=3e5;i++){//预处理出2e5内的阶乘以及其逆元
        num[i]=num[i-1]*i%mod;
        inv[i]=kmi(num[i],mod-2);
    }
}


void solve(){
    int n,m;cin>>n>>m;
    vector<pii>e0,e1,e2;
    for(int i=1;i<=m;i++){
        int u,v,w;cin>>u>>v>>w;
       if(w==0) e0.push_back({u,v});
       else if(w==1) e1.push_back({u,v});
       else e2.push_back({u,v});
    }
    vector<pii>ans1,ans2,ans3;
    auto ck1=[&]()->bool{
        int pos0=0,pos1=0;
        bool ok1=0,ok2=0;
        vector<int>p(n+10);
        for(int i=1;i<=n;i++) p[i]=i;
        auto find=[&](auto &&find,int x)->int{
            if(x==p[x]) return x;
            else return p[x]=find(find,p[x]);
        };
        auto merge=[&](int a,int b)->bool{
            int x=find(find,a),y=find(find,b);
            if(x==y) return 0;
            if(x>y) swap(x,y);
            p[y]=x;
            return 1;
        };

        for(int ct=0;ct<e0.size()+e1.size();ct++){
            if(ct%2){
                if(pos0<e0.size()){
                    auto [u,v]=e0[pos0];pos0++;
                    if(merge(u,v)){
                        ok1=1;
                        ans1.push_back({u,v});
                    }
                }
                else{
                    auto [u,v]=e1[pos1];pos1++;
                    if(merge(u,v)){
                        ok2=1;
                        ans1.push_back({u,v});
                    }
                }
            }
            else{
                if(pos1<e1.size()){
                    auto [u,v]=e1[pos1];pos1++;
                    if(merge(u,v)){
                        ok2=1;
                        ans1.push_back({u,v});
                    }
                }
                else{
                    auto [u,v]=e0[pos0];pos0++;
                    if(merge(u,v)){
                        ok1=1;
                        ans1.push_back({u,v});
                    }
                }
            }
        }
        for(int i=1;i<=n;i++){
            if(find(find,i)!=1) return 0;
        }
        return (ok1&ok2);
    };
    auto ck2=[&]()->bool{
        int pos0=0,pos2=0;
        bool ok1=0,ok2=0;
        vector<int>p(n+10);
        for(int i=1;i<=n;i++) p[i]=i;
        auto find=[&](auto &&find,int x)->int{
            if(x==p[x]) return x;
            else return p[x]=find(find,p[x]);
        };
        auto merge=[&](int a,int b)->bool{
            int x=find(find,a),y=find(find,b);
            if(x==y) return 0;
            if(x>y) swap(x,y);
            p[y]=x;
            return 1;
        };
        
        for(int ct=0;ct<e0.size()+e2.size();ct++){
            if(ct%2){
                if(pos0<e0.size()){
                    auto [u,v]=e0[pos0];pos0++;
                    if(merge(u,v)){
                        ok1=1;
                        ans2.push_back({u,v});
                    }
                }
                else{
                    auto [u,v]=e2[pos2];pos2++;
                    if(merge(u,v)){
                        ok2=1;
                        ans2.push_back({u,v});
                    }
                }
            }
            else{
                if(pos2<e2.size()){
                    auto [u,v]=e2[pos2];pos2++;
                    if(merge(u,v)){
                        ok2=1;
                        ans2.push_back({u,v});
                    }
                }
                else{
                    auto [u,v]=e0[pos0];pos0++;
                    if(merge(u,v)){
                        ok1=1;
                        ans2.push_back({u,v});
                    }
                }
            }
        }
        for(int i=1;i<=n;i++){
            if(find(find,i)!=1) return 0;
        }
        return (ok2&ok1);
    };
    auto ck3=[&]()->bool{
        int pos1=0,pos2=0;
        bool ok1=0,ok2=0;
        vector<int>p(n+10);
        for(int i=1;i<=n;i++) p[i]=i;
        auto find=[&](auto &&find,int x)->int{
            if(x==p[x]) return x;
            else return p[x]=find(find,p[x]);
        };
        auto merge=[&](int a,int b)->bool{
            int x=find(find,a),y=find(find,b);
            if(x==y) return 0;
            if(x>y) swap(x,y);
            p[y]=x;
            return 1;
        };
        
        for(int ct=0;ct<e1.size()+e2.size();ct++){
            if(ct%2){
                if(pos1<e1.size()){
                    auto [u,v]=e1[pos1];pos1++;
                    if(merge(u,v)){
                        ok1=1;
                        ans3.push_back({u,v});
                    }
                }
                else{
                    auto [u,v]=e2[pos2];pos2++;
                    if(merge(u,v)){
                        ok2=1;
                        ans3.push_back({u,v});
                    }
                }
            }
            else{
                if(pos2<e2.size()){
                    auto [u,v]=e2[pos2];pos2++;
                    if(merge(u,v)){
                        ok2=1;
                        ans3.push_back({u,v});
                    }
                }
                else{
                    auto [u,v]=e1[pos1];pos1++;
                    if(merge(u,v)){
                        ok1=1;
                        ans3.push_back({u,v});
                    }
                }
            }
        }
        for(int i=1;i<=n;i++){
            if(find(find,i)!=1) return 0;
        }
        return (ok1&ok2);
    };
    if(ck1()){
        for(auto [u,v]:ans1){
            cout<<u<<" "<<v<<endl;
        }
        return;
    }
    if(ck2()){
        for(auto [u,v]:ans2){
            cout<<u<<" "<<v<<endl;
        }
        return;
    }
    if(ck3()){
        for(auto [u,v]:ans3){
            cout<<u<<" "<<v<<endl;
        }
        return;
    }
    cout<<-1;
}
signed main(){
    ios_base::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
   // init();
    int T=1;//cin>>T;
    while(T--){
        solve();
        cout<<endl;
    }
    return 0;
}
相关推荐
先吃饱再说14 小时前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰16 小时前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术18 小时前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六21 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术1 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize1 天前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考1 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队2 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode