zoukankan      html  css  js  c++  java
  • 中南多校对抗赛 第三场 E

    E:Eulerian Flight Tour

    题意:

    给你一张无向图,要你给这个图加边使得其形成一个欧拉回路

    题解:

    首先使得所有节点的度都为偶数,然后将这个图联通起来

    对于度为奇数的点,将将他和他的父节点连接起来

    连接完后如果这个图是联通的,那么就直接输出结果

    如果这个图有多个联通块:

    分类讨论:

    如果有2个联通块,两个联通块对着连成一个环

    如果有多个联通块,用一个环将这几个联通块连起来即可

    代码:

    # E:Eulerian Flight Tour
    
    ## 题意:
    
    给你一张无向图,要你给这个图加边使得其形成一个欧拉回路
    
    ## 题解:
    
    首先使得所有节点的度都为偶数,然后将这个图联通起来
    
    对于度为奇数的点,将将他和他的父节点连接起来
    
    连接完后如果这个图是联通的,那么就直接输出结果
    
    如果这个图有多个联通块:
    
    分类讨论:
    
    如果有2个联通块,两个联通块对着连成一个环
    
    如果有多个联通块,用一个环将这几个联通块连起来即可
    
    代码:
    
    ```c++
    #include<bits/stdc++.h>
    using namespace std;
    typedef pair<int, int> pii;
    #define FIN freopen("input.txt","r",stdin);
    const int maxn = 4e3 + 5;
    int n, m;
    int vis[maxn];
    int deg[maxn];
    bool G[maxn][maxn];
    bool flag;
    vector<pii> ans;
    void dfs(int u, int p) {
        vis[u] = 1;
        for(int v = 1; v <=n; v++) {
            if(vis[v]) continue;
            if(G[u][v]) continue;
            dfs(v, u);
        }
        if(deg[u] & 1) {
            if(p == -1) flag = false;
            else {
                ans.push_back(make_pair(u, p));
                deg[u]++, deg[p]++;
                G[u][p] = G[p][u] = 1;
            }
        }
    }
    
    vector<int> tmp;
    vector<vector<int>> A;
    void dfs1(int u) {
        vis[u] = 1;
        for(int v = 1; v <= n; v++) {
            if(v == u) continue;
            if(vis[v]) continue;
            if(!G[u][v]) continue;
            dfs1(v);
        }
        tmp.push_back(u);
    }
    int main() {
    #ifndef ONLINE_JUDGE
        FIN
    #endif
        cin >> n >> m;
        memset(deg,0,sizeof(deg));
        memset(G,0,sizeof(G));
        for(int i = 0, u, v; i < m; i++) {
            cin >> u >> v;
    //        u--,v--;
            deg[u]++, deg[v]++;
            G[u][v] = G[v][u] = 1;
        }
    //    cout<<"hhh"<<endl;
        flag = true;
        ans.clear();
        for(int i = 1; i <= n; i++) {
            if(vis[i]) continue;
            dfs(i, -1);
        }
        if(!flag) {
            cout << -1 << endl;
        } else {
            memset(vis, 0, sizeof(vis));
            for(int i = 1; i <= n; i++) {
                if(vis[i]) continue;
                tmp.clear();
                dfs1(i);
                A.push_back(tmp);
            }
            if (A.size() == 2) {
                if (A[0].size() > A[1].size()) swap(A[0], A[1]);
                if (A[0].size() == 1) {
                    int t = A[0][0];
                    int u = -1, v=-1;
                    for (int i = 0; i < A[1].size(); ++i) {
                        for(int j = i + 1; j < A[1].size(); ++j) {
                            int cu = A[1][i], cv = A[1][j];
                            if (!G[cu][cv]) u = cu, v = cv;
                        }
                    }
                    if (u == -1) {
                        if (ans.size() == 0) {
                            cout << -1 << endl;
                            return 0;
                        }
                        u = ans.back().first;
                        v = ans.back().second;
                        ans.pop_back();
                    } else {
                        ans.push_back(make_pair(u, v));
                    }
                    ans.push_back(make_pair(t, u));
                    ans.push_back(make_pair(t, v));
                } else {
                    for (int it = 0; it < 2; ++it) {
                        for (int it2 = 0; it2 < 2; ++it2) {
                            ans.push_back(make_pair(A[0][it], A[1][it2]));
                        }
                    }
                }
            } else if (A.size() > 2) {
                for (int i = 0; i < A.size(); ++i) {
                    int j = (i + 1) % A.size();
                    ans.push_back(make_pair(A[i][0], A[j][0]));
                }
            }
            cout << ans.size() << endl;
            for (int i = 0; i < ans.size(); i++) {
                if (ans[i].first > ans[i].second) swap(ans[i].first, ans[i].second);
                cout << ans[i].first << " " << ans[i].second  << endl;
            }
        }
        return 0;
    }
    
    ```
    View Code

     

    每一个不曾刷题的日子 都是对生命的辜负 从弱小到强大,需要一段时间的沉淀,就是现在了 ~buerdepepeqi
  • 相关阅读:
    Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)
    IP地址资源的分配和管理
    破解中常见的指令及修改
    8086 CPU 寻址方式
    汇编指令速查
    关于ida pro的插件keypatch
    动态方式破解apk进阶篇(IDA调试so源码)
    IDA7.0安装keypatch和findcrypt-yara插件
    Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
    IDA动态调试技术及Dump内存
  • 原文地址:https://www.cnblogs.com/buerdepepeqi/p/10630195.html
Copyright © 2011-2022 走看看