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\n", 
                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\n", 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\n");
    } else {
        graph.check(n);
        graph.getSolution();
    }
    
    //system("pause");
}

 

posted @ 2013-07-30 16:08  litstrong  阅读(221)  评论(0)    收藏  举报