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图).具有欧拉路 ...
随机推荐
- 从数据库导出数为生成excel表
mysql -umaster -hxx.xx.xx.xx -p -e "set names utf8; use xxxdb;select * from t_order where t_ord ...
- Android bluetooth用户自定义数据
default mac: [btif_core.c] btif_fetch_local_bdaddr() default device name: [btif_dm.c] btif_get_defau ...
- 取得表中数据的insert语句
Build Insert Statements for the Existing Data in Tables 下面这个脚本实现了取得一个非空表中的所有insert语句 This script bui ...
- Codeforces Round #363 Fix a Tree(树 拓扑排序)
先做拓扑排序,再bfs处理 #include<cstdio> #include<iostream> #include<cstdlib> #include<cs ...
- 使用 Log4Net 记录日志
第一步:下载Log4Net 下载地址:http://logging.apache.org/log4net/download_log4net.cgi 把下载的 log4net-1.2.11-bin-n ...
- android 入门- 词汇
final Resources.Theme theme = context.getTheme(); TypedArray a = theme.obtainStyledAttributes();获得自定 ...
- WPF MVVM模式下实现ListView下拉显示更多内容
在手机App中,如果有一个展示信息的列表,通常会展示很少一部分,当用户滑动到列表底部时,再加载更多内容.这样有两个好处,提高程序性能,减少网络流量.这篇博客中,将介绍如何在WPF ListView中实 ...
- hdu 2516 FIB博弈
分析请看:cxlove #include<iostream> #include<cstdio> #include<cstring> #include<algo ...
- Android ViewPager使用详解(转)
这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等.那如 ...
- 在Eclipse中用图形界面的方式获取Salesforce中Object的Query语句
对Salesforce中的Object进行相应的Query是必不可少的操作,大家可以去这个链接去看看官网的解读 http://docs.database.com/dbcom/en-us/db_sos ...