牛客周赛 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;
}
相关推荐
数模竞赛Paid answer1 分钟前
2021年深圳杯数学建模C题配电网可靠性和故障软自愈研究解题全过程论文及程序
算法·数学建模·数据分析·深圳杯
有点。6 分钟前
C++广度优先搜索(二)-练习题
c++·算法·宽度优先
疯狂打码的少年19 分钟前
【数据结构】队列的应用:循环队列
数据结构·笔记·算法
evans在进步22 分钟前
LeetCode 17:电话号码的字母组合——Java DFS 回溯法详解
java·leetcode·深度优先
Winner_hwx33 分钟前
python拓展
算法
TAN-90°-44 分钟前
Deep Learning for Computer Vision——Image Classification with Linear Classifiers
python·深度学习·算法·计算机视觉·线性回归
阿pin1 小时前
Java随笔-红黑树
java·python·算法·红黑树
Hi李耶1 小时前
【LeetCode】17.电话号码的字母组合
算法·leetcode·职场和发展
江畔柳前堤10 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore11 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode