ACM: SGU 101 Domino- 欧拉回路-并查集
Time Limit:250MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u
Description
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 - //这个题目做了我一个晚上,有点头晕,还是要让自己保持冷静啊。。。 //多米诺骨牌有两个面,每个面有一个数字,相同的数字只能推倒相同数字面的骨牌,骨牌可以转向,给出的数字是严格的正面反面,问是否能推到所有的骨牌。 //如果可以输出骨牌的顺序和是否需要反转骨牌。如果不可以全部推倒,输出"No solution" //AC代码:
#include"algorithm"
#include"iostream"
#include"cstring"
#include"cstdlib"
#include"string"
#include"cstdio"
#include"vector"
#include"cmath"
#include"queue"
using namespace std;
#define memset(x,y) memset(x,y,sizeof(x))
#define memcpy(x,y) memcpy(x,y,sizeof(x))
#define MX 401 bool vis[MX];
int Head[MX],cnt;
int indegree[MX],p[MX],siz,bin;
int fid[7]; struct Edge {
int v,nxt;
int flag;
} E[MX]; int find(int x) {
return fid[x]==x?x:(fid[x]=find(fid[x]));
} void union_root(int st,int ed) {
int rt1=find(st);
int rt2=find(ed);
if(rt1!=rt2)fid[rt2]=rt1;
} void edge_init() {
cnt=0;
siz=0;
memset(p,0);
memset(E,0);
memset(vis,0);
memset(Head,-1);
memset(indegree,0);
for(int i=0; i<=6; i++) {
fid[i]=i;
}
} void edge_add(int st,int ed,int flag) {
E[cnt].v=ed;
E[cnt].flag=flag;
E[cnt].nxt=Head[st];
Head[st]=cnt++;
} bool check() {
bin=-1;
int tot=0;
for(int i=0; i<=6; i++) {
if(vis[i]) {
if(bin==-1)bin=i;
if(indegree[i]%2) {
tot++;
if(tot>2)return 0;//判断奇数有多少个,超过两个奇数就判断不是
bin=i;
}
}
}
for(int i=0; i<=6; i++) {
if(bin!=-1)if(indegree[i]&&find(i)!=find(bin))return 0; //如果不是联通块就判断不是
}
if(bin==-1)return 0;
if(tot==1)return 0; //如果奇数只有一个判断不是
else return 1;
} void Fleury(int u,int e) {
for(int i=Head[u]; ~i; i=E[i].nxt) {
int v=E[i].v;
if(vis[i|1])continue;
vis[i|1]=1;
Fleury(v,E[i].flag);
}
if(e)p[siz++]=e; //标记是哪一条边。
} int main() {
int m,st,ed;
while(~scanf("%d",&m)) {
edge_init();
for(int i=1; i<=m; i++) {
scanf("%d%d",&st,&ed);
vis[st]=vis[ed]=1;
edge_add(st,ed,i); //正向
edge_add(ed,st,-i); //记录多米诺骨牌是否需要转向 反向
indegree[st]++;
indegree[ed]++;
union_root(st,ed); //合成联通块
}
bool flag=check();
if(!flag)puts("No solution");
else {
memset(vis,0); //再次清空标记数组
Fleury(bin,0);
for(int i=siz-1; i>=0; i--) {
printf("%d %c\n",p[i]>0?p[i]:-p[i],p[i]>0?'+':'-');
}
}
}
return 0;
}
ACM: SGU 101 Domino- 欧拉回路-并查集的更多相关文章
- ACM: FZU 2112 Tickets - 欧拉回路 - 并查集
FZU 2112 Tickets Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u P ...
- SGU 101 Domino (输出欧拉路径)
101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB Dominoes – game played wit ...
- hdu 1116 欧拉回路+并查集
http://acm.hdu.edu.cn/showproblem.php?pid=1116 给你一些英文单词,判断所有单词能不能连成一串,类似成语接龙的意思.但是如果有多个重复的单词时,也必须满足这 ...
- HDU 1116 Play on Words(欧拉回路+并查集)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1116 Play on Words Time Limit: 10000/5000 MS (Java/Ot ...
- HDU1878 欧拉回路---(并查集+图论性质)
http://acm.hdu.edu.cn/showproblem.php?pid=1878 欧拉回路 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- ACM: Mr. Kitayuta's Colorful Graph-并查集-解题报
Mr. Kitayuta's Colorful GraphTime Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I6 ...
- HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)
题目链接 题意 : 有很多门,每个门上有很多磁盘,每个盘上一个单词,必须重新排列磁盘使得每个单词的第一个字母与前一个单词的最后一个字母相同.给你一组单词问能不能排成上述形式. 思路 :把每个单词看成有 ...
- POJ2513——Colored Sticks(Trie树+欧拉回路+并查集)
Colored Sticks DescriptionYou are given a bunch of wooden sticks. Each endpoint of each stick is col ...
- nyist 42 一笔画 (欧拉回路 + 并查集)
nyoj42 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径. 若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路 ...
随机推荐
- jQuery - 1.简单的JQuery
1.简单的JQuery 2.jQuery对象(包装集).Dom对象 3.JQuery提供的函数 1.简单的JQuery $(document).ready(function () { alert(&q ...
- GBDT原理实例演示 1
考虑一个简单的例子来演示GBDT算法原理 下面是一个二分类问题,1表示可以考虑的相亲对象,0表示不考虑的相亲对象 特征维度有3个维度,分别对象 身高,金钱,颜值 cat dating.txt ...
- Pyqt 打包资源文件
用打包工具将做好的Pyqt程序打包成exe后发现引用的资源图片都显示不了? 是否遇到了和我一样的问题呢.google之后找到了方法,一种方法是在程序中引用外部资源,另外一种方法是将资源文件转换为py文 ...
- 网站通用登录模块代码 分类: ASP.NET 2014-12-06 10:49 615人阅读 评论(0) 收藏
1.HTML部分: <form id="form1" runat="server"> <script src=".. ...
- android 入门-本地化语言
打包安装到手机上,改变手机系统语言,你在看看是不是改变了.哇.真的可以.
- 豆瓣的账号登录及api操作
.douban.php <?php /** * PHP Library for douban.com * * @author */ class doubanPHP { function __co ...
- WPF QuickStart系列之附加属性(Attached Property)
这一篇博客是关于如何使用附加属性和创建自定义附加属性的. 1. 附加属性使用, WPF中对附加属性使用最多的莫过于对控件布局时设置控件的位置,例如在Canvas中有一个Rectangle, Ellip ...
- [Linux][VMWare] 学习笔记之安装Linux系统-网络配置
最近开始折腾Linux,在本机装了个VMWare和Centos,装完之后虚拟机里面的OS可以上网,但是使用SecureCRT连接不上虚拟机,开始折腾这个网络. vmware安装好以后,会自动添加两张网 ...
- Spring之ResourceLoader加载资源
Resource与ResourceLoader对比 1.Resource接口定义了应用访问底层资源的能力. 通过FileSystemResource以文件系统绝对路径的方式进行访问: 通过ClassP ...
- css 内联元素
内联元素又名行内元素(inline element),和其对应的是块元素(block element),都是html规范中的概念.内联元素的显示,为了帮助理解,可以形象的称为“文本模式”,即一个挨着一 ...