sgu101Domino

弱的一笔啊!!

都知道这题是欧拉路径都还Wa了那么久。。。伤心!

原来欧拉路径的压栈一定要在dfs()之后压。。。

这题就是将牌骨的数字看做点,把牌看做连接两点的边。。。这样就成了欧拉路了

// File Name: 1002.cpp
// Author: zlbing
// Created Time: 2013/2/24 11:39:49

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
using namespace std;
#define CL(x,v); memset(x,v,sizeof(x));
#define INF 0x3f3f3f3f
#define MAXN 20005

struct Edge{
    int from,to;
};
vector<int>G[MAXN];
vector<Edge>edges;
int A[MAXN];
vector<int> E;
int vis[MAXN];
void dfs(int u)
{
    for(int i=0;i<G[u].size();i++)
    {
        int m=G[u][i];
        Edge& e=edges[G[u][i]];
        int v=e.to;
        if(vis[m])continue;
        vis[m]=vis[m^1]=1;
        //E.push_back(m);把这句写在这里 Wa了好久。。。原来我一直没明白欧拉路的原理..
        dfs(v);
        E.push_back(m);
    }
}

int main(){
    int n;
    while(~scanf("%d",&n))
    {
        int a,b;
        for(int i=0;i<7;i++)G[i].clear();
        edges.clear();
        E.clear();
        CL(A,0);
        int S=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            A[a]++,A[b]++;
            edges.push_back((Edge){a,b});
            int m=edges.size();
            G[a].push_back(m-1);
            edges.push_back((Edge){b,a});
            m=edges.size();
            G[b].push_back(m-1);
        }
        for(int i=0;i<7;i++)
            if(A[i]){
                S=i;break;
            }
        CL(vis,0);
        int cnt=0;
        for(int i=0;i<7;i++)
            if(A[i]%2)
            {
                S=i;cnt++;
            }
        if(!(cnt==0||cnt==2)){
            printf("No solution\n");
            continue;
        }
        dfs(S);
        if(E.size()!=n)
        {
            printf("No solution\n");
            continue;
        }
        for(int i=E.size()-1;i>=0;i--){
            printf("%d ",(E[i]/2)+1);
            if(E[i]%2)printf("-\n");
            else printf("+\n");
        }    
    }
    return 0;
}
原文地址:https://www.cnblogs.com/arbitrary/p/2936887.html