zoukankan      html  css  js  c++  java
  • SGU 101 AC

    总算AC了,好帅气的算法,同时解决了自环跟非连通,一种自下向上找环的算法过程,这里把欧拉回路讲得很清楚,赞。

    #include <iostream>
    #include <vector>
    #include <string>
    #include <queue>
    #include <map>
    #include <string.h>
    using namespace std;
    
    class Edge {
    public:
        int no, u, v;
        char d;
        Edge() {
            no = u = v = d = -1;
        }
        Edge reverse() {
            Edge rev;
            rev.no = no;
            rev.u = v;
            rev.v = u;
            rev.d = d == '+' ? '-' : '+';
            return rev;
        }
    };
    
    class Graph {
    private:
        map<int, int> u2i;
        vector<vector<Edge> > G;
        int deg[210], n, no, use[105], vUse[210];
        vector<Edge> solution;
    public:
        Graph(vector<Edge>& edges) {
            n = edges.size();
            makeU2I(edges);
            memset(deg, 0, sizeof(deg));
            G.clear();
            G.resize(no);
            for (int i = 0; i < edges.size(); i++) {
                G[u2i[edges[i].u]].push_back(edges[i]);
                G[u2i[edges[i].v]].push_back(edges[i].reverse());
                deg[u2i[edges[i].u]]++;
                deg[u2i[edges[i].v]]++;
            }
        }
        void makeU2I(vector<Edge>& edges) {
            u2i.clear();
            for (int i = 0; i < edges.size(); i++) {
                u2i[edges[i].u] = u2i[edges[i].v] = 0;
            }
            no = 0;
            for (map<int, int>::iterator it = u2i.begin(); it != u2i.end(); it++) {
                it->second = no++;
            }
        }
        int solve() {
            int beg = -1, end = -1;
            for (int i = 0; i < no; i++) {
                if (deg[i] & 1) {
                    if (beg == -1) {
                        beg = i;
                    } else if (end == -1) {
                        end = i;
                    } else {
                        return -1;
                    }
                }
            }
            if (beg == -1) {
                beg = 0;
            }
            memset(use, 0, sizeof(use));
            Edge begEdge;
            dfs(beg, -1, begEdge);
            if (solution.size() < n) {
                // 判连通
                return -1;
            }
            return 0;
        }
        void dfs(int u, int sign, Edge lastEdge) {
            for (int i = 0; i < G[u].size(); i++) {
                if (use[G[u][i].no] == 0) {
                    use[G[u][i].no] = 1;
                    dfs(u2i[G[u][i].v], 1, G[u][i]);
                }
            }
    
            if (sign > 0) {
                solution.push_back(lastEdge);
            }
        }
        void getSolution() {
            for (int i = solution.size() - 1; i >= 0; i--) {
                printf("%d %c
    ", solution[i].no, solution[i].d);
            }
        }
    };
    
    int main()
    {
        int n;
        scanf("%d", &n);
    
        vector<Edge> edges;
        for (int i = 0; i < n; i++) {
            int a, b;
            scanf("%d%d", &a, &b);
    
            Edge e;
            e.no = i + 1;
            e.u = a; e.v = b;
            e.d = '+';
    
            edges.push_back(e);        
        }
    
        Graph graph(edges);
        if (graph.solve() == -1) {
            printf("No solution
    ");
        } else {
            graph.getSolution();
        }
    
        //system("pause");
    }
  • 相关阅读:
    微信公众号开发 该公众号提供的服务出现故障,请稍后再试
    docker 搭建以太坊私有链搭建
    docker /var/lib/docker/aufs/mnt 目录满了,全是垃圾数据
    golang 如何将imagemagick 和golang 打包到docker 环境中
    CSharpGL(2)设计和使用场景元素及常用接口
    CSharpGL(1)从最简单的例子开始使用CSharpGL
    CSharpGL(0)一个易学易用的C#版OpenGL
    Opengl中矩阵和perspective/ortho的相互转换
    C#+OpenGL+FreeType显示3D文字(3)
    C#+OpenGL+FreeType显示3D文字(2)
  • 原文地址:https://www.cnblogs.com/litstrong/p/3233043.html
Copyright © 2011-2022 走看看