zoukankan      html  css  js  c++  java
  • SGU 101 修改

    感谢这里

    test4确实是个不连通的case,奇怪的是我用check函数跟if (check() == false)来判断这个case,当不连通时就死循环,得到的结果是不一样的,前者得到WA,后者得到TLE,难道SGU能自动在某个条件下终止死循环,然后返回false吗。

    不连通的情况FIX了,修改了代码如下:

    #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 reverse() {
            Edge rev;
            rev.no = no;
            rev.u = v;
            rev.v = u;
            rev.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));
            dfs(beg);
            return 0;
        }
        bool dfs(int u) {
            for (int i = 0; i < G[u].size(); i++) {
                if (use[G[u][i].no] == 0) {
                    use[G[u][i].no] = 1;
    
                    if (dfs(u2i[G[u][i].v])) {
                        solution.push_back(G[u][i]);
                        return true;
                    } else {
                        use[G[u][i].no] = 0;
                    }
                }
            }
            for (int i = 1; i <= n; i++) {
                if (use[i] == 0) {
                    return false;
                }
            }
            return true;
        }
        void check(int n) {
            if (solution.size() != n) {
                while (1);
            }
            for (int i = 0; i < solution.size() - 1; i++) {
                /*
                printf("%d %d, %d %d
    ", 
                    solution[i].getU(), solution[i].getV(),
                    solution[i + 1].getU(), solution[i + 1].getV());
                    */
                
                //if (solution[i].getV() != solution[i + 1].getU()) {
                if (solution[i].v != solution[i + 1].u) {
                    while (1);
                }
                
                
            }
        }
        bool check2(int n) {
            if (solution.size() != n) {
                while (1);
                return false;
            } else {
                return true;
            }
        }
        bool checkConnectity() {
            memset(vUse, 0, sizeof(vUse));
            vector<int> Q;
            Q.push_back(0);
            vUse[0] = 1;
    
            for (int i = 0; i < Q.size(); i++) {
                for (int j = 0; j < G[Q[i]].size(); j++) {
                    if (vUse[u2i[G[Q[i]][j].v]] == 0) {
                        vUse[u2i[G[Q[i]][j].v]] = 1;
                        Q.push_back(u2i[G[Q[i]][j].v]);
                    }
                }
            }
    
            for (int i = 0; i < no; i++) {
                if (vUse[i] == 0) {
                    return false;
                }
            }
            return true;
        }
        void getSolution() {
            //for (int i = 0; i < solution.size(); i++) {
            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 || graph.checkConnectity() == false) {
            printf("No solution
    ");
        } else {
            graph.getSolution();
        }
        
        //system("pause");
    }

    上面的代码能处理自环的情况,可面临一个链上套了很多环的情况就会TLE,test 13应该就是这样的一个case。

  • 相关阅读:
    LOJ DFS序
    牛客练习赛31 D神器大师泰兹瑞与威穆
    Codeforces Round #487 (Div. 2) C
    Manthan, Codefest 18 (rated, Div. 1 + Div. 2) C D
    [Windows Server 2003] 还原SQL Server数据库
    [Windows Server 2008] 查看PHP详细错误信息
    [Windows Server 2008] 安装网站伪静态
    网站Gzip压缩
    [Windows Server 2008] SQL Server 2008 数据库还原方法
    [Windows Server 2008] 安装Apache+PHP+MySQL
  • 原文地址:https://www.cnblogs.com/litstrong/p/3227026.html
Copyright © 2011-2022 走看看