• cf 723e One-Way Reform


    题意:给你一个无向图,使其变为有向,让入度==出度的点最多。
    思路:
    想通一个点:只有度数为偶数的点可以满足条件。想通这一点之后可以跟奇点建立一些虚边,跑欧拉回路。
    代码:

    #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 = 205;
    const int maxm = maxn*maxn;
    
    int head[maxn],tot,deg[maxn];
    struct edge{
        int v,nex;
        bool ok;
    }e[maxm];
    vector<pair<int,int> > res;
    void init(int n){
        forn(i,n+5) head[i] = -1,deg[i] = 0;
        tot = 0;
        res.clear();
    }
    void add(int u,int v){
        e[tot] = {v,head[u],0};
        head[u] = tot++;
    }
    void euler(int u){
        for(int i = head[u];i!=-1;i = e[i].nex){
            if(e[i].ok) continue;
            int v = e[i].v;
            e[i].ok = e[i^1].ok = 1;
            euler(v);
            res.push_back({u,v});
        }
    }
    int main(){
        IO;
        int t;cin>>t;
        while(t--){
            int n,m;cin>>n>>m;
            init(n);
            forn(i,m){
                int u,v;cin>>u>>v;
                add(u,v),add(v,u);
                deg[u]++,deg[v]++;
            }
            int ans = n;
            for1(i,n) if(deg[i]&1) add(0,i),add(i,0),ans--;
            for1(i,n) if(head[i]!=-1) euler(i);
            cout<< ans <<'
    ';
            reverse(res.begin(),res.end());
            for(auto &x:res){
                if(!x.first||!x.second) continue;
                cout<<x.first<<' '<<x.second<<'
    ';
            }
        }
        return 0;
    }
    
  • 相关阅读:
    LineageOS将会重生 CyanogenMod会继续下去
    著名第三方ROM Cyanogen Mod宣布关闭
    Service Worker API (mozilla) vs Service Workers (google)
    Service Worker 入门
    Web新技术:PWA
    (OK) 编译 cm-13-kiwi for (华为 荣耀 5X)
    4
    3
    2
    1
  • 原文地址:https://www.cnblogs.com/AlexPanda/p/12520290.html
Copyright © 2020-2023  润新知