求欧拉路径...直接dfs即可,时间复杂度O(N)

---------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
 
using namespace std;
 
#define X(i) Edge[i].first
#define Y(i) Edge[i].second
typedef pair<int, int> pii;
 
const int maxn = 10;
const int maxm = 109;
const int n = 7;
 
struct edge {
int to, F, Id;
edge* next;
} E[maxm << 1], *pt = E, *head[maxn];
 
void AddEdge(int u, int v, int Id, int f) {
pt->to = v;
pt->F = f;
pt->Id = Id;
pt->next = head[u];
head[u] = pt++;
}
 
inline edge* Rev(edge* e) {
return E + ((e - E) ^ 1);
}
 
pii Edge[maxm];
int N, cnt[maxn], par[maxn];
stack<pii> S;
 
int Find(int x) {
return x == par[x] ? x : par[x] = Find(par[x]);
}
 
bool chk() {
int c = 0;
for(int i = 0; i < n; i++)
if((cnt[i] & 1) && ++c > 2) return false;
for(int i = 0; i < n; i++) par[i] = i;
for(int i = 0; i < N; i++)
par[Find(X(i))] = Find(Y(i));
c = -1;
for(int i = 0; i < n; i++) if(cnt[i]) {
if(!~c) 
c = par[i];
else if(par[i] != c)
return false;
}
return true;
}
 
void Euler(int x) {
for(edge*&e = head[x]; e; ) if(e->F) {
int F = e->F, t = e->to, Id = e->Id;
e->F = Rev(e)->F = 0;
e = e->next;
Euler(t);
S.push(make_pair(Id, F));
} else
e = e->next;
}
 
int main() {
scanf("%d", &N);
memset(cnt, 0, sizeof cnt);
for(int i = 0; i < N; i++) {
scanf("%d%d", &X(i), &Y(i));
cnt[X(i)]++;
cnt[Y(i)]++;
AddEdge(X(i), Y(i), i, 1);
AddEdge(Y(i), X(i), i, -1);
}
if(!chk()) {
puts("No solution");
return 0;
}
for(int i = 0; i < n; i++) if(cnt[i] & 1) {
Euler(i);
while(!S.empty()) {
pii p = S.top(); S.pop();
printf("%d %c\n", ++p.first, p.second != 1 ? '-' : '+');
}
return 0;
}
for(int i = 0; i < n; i++) if(cnt[i]) {
Euler(i);
while(!S.empty()) {
pii p = S.top(); S.pop();
printf("%d %c\n", ++p.first, p.second != 1 ? '-' : '+');
}
return 0;
}
return 0;
}

---------------------------------------------------------------------------

101. Domino

time limit per test: 0.25 sec. 
memory limit per test: 4096 KB

Dominoes – game played with small, rectangular blocks of wood or other material, each identified by a number of dots, or pips, on its face. The blocks usually are called bones, dominoes, or pieces and sometimes men, stones, or even cards.
The face of each piece is divided, by a line or ridge, into two squares, each of which is marked as would be a pair of dice...

The principle in nearly all modern dominoes games is to match one end of a piece to another that is identically or reciprocally numbered.

ENCYCLOPÆDIA BRITANNICA

Given a set of domino pieces where each side is marked with two digits from 0 to 6. Your task is to arrange pieces in a line such way, that they touch through equal marked sides. It is possible to rotate pieces changing left and right side.

Input

The first line of the input contains a single integer N (1 ≤ N ≤ 100) representing the total number of pieces in the domino set. The following N lines describe pieces. Each piece is represented on a separate line in a form of two digits from 0 to 6 separated by a space.

Output

Write “No solution” if it is impossible to arrange them described way. If it is possible, write any of way. Pieces must be written in left-to-right order. Every of N lines must contains number of current domino piece and sign “+” or “-“ (first means that you not rotate that piece, and second if you rotate it).

Sample Input

5 1 2 2 4 2 4 6 4 2 1 

Sample Output

2 - 5 + 1 + 3 + 4 - 

SGU 101.Domino( 欧拉路径 )的更多相关文章

  1. SGU 101 Domino (输出欧拉路径)

    101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB Dominoes – game played wit ...

  2. sgu 101 Domino 解题报告及测试数据

    101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB 题解: 求多米诺骨牌按照一定方式放置能否使相邻的位置 ...

  3. SGU 101 Domino【欧拉路径】

    题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=101 题意: N个多米诺骨牌,每个骨牌左右两侧分别有一个0~6的整数(骨牌可以旋转 ...

  4. Domino - SGU 101 (欧拉路径)

    题目大意:这是一个多米诺骨游戏,这个游戏的规则就是一个连着一个,现在给出 N 个多米诺,每个多米诺两边都有一个编号,相邻的多米诺的编号要一致,当然多米诺是可以翻转的(翻转就加‘-’,不翻转是‘+’), ...

  5. SGU 101.Domino (欧拉路)

    时间限制: 0.5 sec 空间限制: 4096 KB 描述 多米诺骨牌,一种用小的方的木块或其他材料,每个都被一些点在面上标记,这些木块通常被称为骨牌.每个骨牌的面都被一条线分成两个   方形,两边 ...

  6. SGU 101 Domino 题解

    鉴于SGU题目难度较大,AC后便给出算法并发布博文,代码则写得较满意后再补上.——icedream61 题目简述:暂略 AC人数:3609(2015年7月20日) 算法: 这题就是一笔画,最多只有7个 ...

  7. sgu 101 domino

    题意还算简洁明了,加上有道翻译凑过着读完了题.题意大体上是 给你 n 个多米诺骨牌, 给出每个骨牌两端的数字, 只有数字相同才可以推到, 比如 2-3和3-2.你可以旋转这些多米诺骨牌, 输出一个可以 ...

  8. ACM: SGU 101 Domino- 欧拉回路-并查集

    sgu 101 - Domino Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Desc ...

  9. SGU 101

    SGU 101,郁闷,想出来算法,但是不知道是哪个地方的问题,wa在第四个test上. #include <iostream> #include <vector> #inclu ...

随机推荐

  1. HDU1506_Largest Rectangle in a Histogram

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  2. sctf pwn300

    拿到程序后,拉入IDA,大概看了一番后,尝试运行,进一步了解程序的功能. 发现NX enabled,No PIE. 一号是一个猜数字的游戏,二号是一个留言本,三号是打印出留言的内容,四号是退出. 观察 ...

  3. Mustache学习

    Mustache是基于JavaScript的一款模版Web引擎,Web 模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,通常是标准的 HTML 文档. 一.Musta ...

  4. android webview点击返回键返回上一级activity

    android webview点击返回键返回上一个activity @Override public boolean onKeyDown(int keyCode, KeyEvent event) { ...

  5. C# GridView弹出窗口新增行 删除行

    <%@ Page Language="C#" AutoEventWireup="true" EnableViewState="true" ...

  6. 在 PL/SQL Developer 中执行SQL文件的方法

    打开 command Window SQL> @'D:\My Documents\Downloads\bde_chk_cbo.sql'; 整个路径及文件两边要有单引号哦!

  7. 移动端使用rem方法

    (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ...

  8. struts2笔记04-XxxAware接口

    1.XxxAware接口 ApplicationAware, RequestAware,SessionAware, ParameterAware.      struts2提供了这四个Aware接口用 ...

  9. spoj BRCKTS - Brackets 线段树

    题目链接 给一个括号序列, 两种操作. 一种将某个位置的括号变反(左变右, 右变左), 第二种是询问这个括号序列是否合法. 线段树, 我们开两个数组lf, rg. 表示某个区间里面, 右边的左括号个数 ...

  10. QSqlDatabase的进一步封装(多线程支持+更加简单的操作)——同时支持MySQL, SQL Server和Sqlite

    开发背景: 1.直接用QSqlDatabase我觉得太麻烦了: 2.对于某些数据库,多个线程同时使用一个QSqlDatabase的时候会崩溃: 3.这段时间没什么干货放出来觉得浑身不舒服,就想写一个. ...