• SGU 101


    SGU 101,郁闷,想出来算法,但是不知道是哪个地方的问题,wa在第四个test上。

    #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], no, use[105];
        vector<Edge> solution;
    public:
        Graph(vector<Edge>& edges) {
            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;
        }
        void 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;
                    solution.push_back(G[u][i]);
                    dfs(u2i[G[u][i].v]);
                    break;
                }
            }
        }
        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);
                }
                
                
            }
        }
        void getSolution() {
            for (int i = 0; i < solution.size(); 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) {
            while (1);
            printf("No solution
    ");
        } else {
            graph.check(n);
            graph.getSolution();
        }
        
        //system("pause");
    }
  • 相关阅读:
    (转)C#特性详解
    PHP MSSQL数据操作PDO API
    DWR
    配置JAVA的环境变量
    关​于​h​i​b​e​r​n​a​t​e​中​双​向​外​键​关​联​o​n​e​-​t​o​-​o​n​e​的​p​r​o​p​e​r​t​y​-​r​e​f​=​的​问​题(转)
    Hibernate 二级缓存 总结整理(转)
    EhCache 分布式缓存/缓存集群(转)
    MySQL分区表(转)
    通用权限设计
    (转)关于Struts 2 拦截器参数丢失问题
  • 原文地址:https://www.cnblogs.com/litstrong/p/3225413.html
Copyright © 2020-2023  润新知