牛客周赛 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;
}
相关推荐
residual_fan1 天前
航空发动机故障诊断专用智能体(三):基于对比学习的时序特征区分方法
人工智能·算法·数据挖掘·数据分析
高亦真1 天前
今天是学习嵌入式的第39天
linux·学习·算法
Omics Pro1 天前
AI药物研发10原则!欧盟EMA×美国FDA
数据库·人工智能·算法·机器学习·自然语言处理
wabs6661 天前
关于二叉树【力扣100.相同的树的思考】
数据结构·c++·算法·leetcode·二叉树·递归法
知知之之1 天前
敏感数据查询:SHA-256 还是 HMAC-SHA256
算法
彧azz1 天前
Java学习记录:判断语句
java·笔记·学习·算法
alphaTao1 天前
LeetCode 每日一题 2026/9/14-2026/9/20
算法·leetcode
hanlin031 天前
刷题笔记:力扣第560题-和为k的子数组
笔记·算法·leetcode
residual_fan1 天前
航空发动机故障诊断专用智能体(四):深度强化学习与自适应奖励机制
人工智能·算法·数据挖掘·数据分析
2601_962218611 天前
万象生鲜系统多终端统一数据协议PC手机PDA数据实时同步
大数据·数据库·人工智能·python·算法