您的位置:首页 > 其它

sgu-101-Domino

2013-02-28 14:44 309 查看
弱的一笔啊!!

都知道这题是欧拉路径都还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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: