• cf527 E Data Center Drama


    题意:无向图,让你定向每条边,有必要可以加一些边,使得图中每个点的入度和出度%2==0,输出最小加边的构造方式。
    思路:奇度相连。a-b-c-d-e改为a->b<-c->d<-e,边为奇数任意一个点连一个自环,之后跑欧拉回路。
    代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define forn(i,n) for(int i=0;i<n;i++)
    #define for1(i,n) for(int i=1;i<=n;i++)
    #define IO ios::sync_with_stdio(false);cin.tie(0)
    const int maxn = 1e5+5;
     
    int head[maxn],tot=2,deg[maxn];
    vector<pair<int,int> >ans;
    struct edge{    
        int v,nex;
        bool flag;
    }e[maxn<<3];
    void euler(int u){
        for(int &i = head[u];i;i = e[i].nex){
            if(e[i].flag) continue;
            e[i].flag = e[i^1].flag = 1;
            int v = e[i].v;
            euler(v);   
            ans.push_back({u,v});
        }
    }
    void add(int u,int v){
        e[tot] = {v,head[u],0};
        head[u] = tot++;
    }
    int main(){
        IO;
        int n,m;cin>>n>>m;
        forn(i,m){
            int u,v;cin>>u>>v;
            add(u,v),add(v,u);
            deg[u]++,deg[v]++;
        }
        vector<int>a;
        for1(i,n) if(deg[i]&1) a.push_back(i);
        int cnt = m;
        for(int i = 0;i<a.size();i+=2){
            add(a[i],a[i+1]);
            add(a[i+1],a[i]);
            cnt++;
        }
        if(cnt&1) add(1,1),add(1,1);
        euler(1);
        cout<<ans.size()<<'
    ';
        reverse(ans.begin(),ans.end());
        bool cur = 0;
        for(auto &x:ans) {
            if(!cur) cout<<x.first<<' '<<x.second<<'
    ';
            else cout<<x.second<<' '<<x.first<<'
    ';
            cur^=1;
        }
        return 0; 
    }
    
  • 相关阅读:
    学习进度条15
    学习进度条14
    第二冲刺阶段——个人工作总结10
    购买图书最低价格
    第二冲刺阶段——个人工作总结09
    第二冲刺阶段——个人工作总结08
    第二冲刺阶段——个人工作总结07
    第二冲刺阶段——个人工作总结06
    学习进度条13
    第二冲刺阶段——个人工作总结05
  • 原文地址:https://www.cnblogs.com/AlexPanda/p/12520289.html
Copyright © 2020-2023  润新知