sgu101 欧拉路径 难度:1
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 -
思路:A:相同点数缩为一点,每个骨牌作为边连接两个点数,则每条边都必须走,这个时候根据欧拉迹的性质,找到度数为奇数的点作为起始点走一遍,或者没有奇数点随便找个点(此时欧拉回路),走一遍dfs遍历全图,看是否有边走不到(每个边只走一次)
WWA:错误原因:1 没有考虑到未联通的状态,直接判断必须是半欧拉图,这样只有一种点数的时候就错误
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
typedef pair<int,int> P;
const int maxn=101;
int n,s,e;
int a[maxn][2];
vector <P> G[maxn];
int heap[maxn],len;
bool vis[maxn];
int deg[maxn];
int stck[2*maxn],slen;
bool used[2*maxn];
void dfs(int x){
for(int i=0;i<G[x].size();i++){//遍历从x出发能到达的点
if(!used[G[x][i].second]){
used[G[x][i].second]=true;//翻转和不翻转的状态都被遍历
used[G[x][i].second^1]=true;
dfs(G[x][i].first);//欧拉路径性质:从一个点出发可以到达所有点,也就是说如果这个点还有没走的边必然会回到这个点
stck[--slen]=G[x][i].second; }
}
}
void addedge(int from,int to,int ind){
G[from].push_back(P(to,2*ind));G[to].push_back(P(from,2*ind+1));
deg[from]++;deg[to]++;
}
int main(){
while(scanf("%d",&n)==1){
for(int i=0;i<maxn;i++)G[i].clear();//初始化
memset(used,0,sizeof(used));
memset(vis,0,sizeof(vis));
memset(deg,0,sizeof(deg));
len=slen=0;
for(int i=0;i<n;i++){
scanf("%d%d",a[i],a[i]+1);
if(!vis[a[i][0]]){heap[len++]=a[i][0];vis[a[i][0]]=true;}//去重
if(!vis[a[i][1]]){heap[len++]=a[i][1];vis[a[i][1]]=true;}
}
bool failed=false;s=e=-1;
for(int i=0;i<n;i++){//以牌为边加边
addedge(a[i][0],a[i][1],i);
}
for(int i=0;i<len;i++){
if(deg[heap[i]]&1){//奇数度点选作起点终点
if(s==-1)s=heap[i];
else if(e==-1)e=heap[i];
else failed=true;
}
}
if(failed){
puts("No solution");
}
else {
if(s==-1)s=heap[0];//欧拉回路任选一个作为起点
slen=n;
dfs(s);
if(slen!=0)puts("No solution");//有边没有遍历到
else for(int i=0;i<n;i++){
printf("%d ",stck[i]/2+1);
printf("%c\n",stck[i]&1?'-':'+');//状态2k为原来状态,2k+1则翻转
}
}
}
return 0;
}
sgu101 欧拉路径 难度:1的更多相关文章
- SGU 101 Domino (输出欧拉路径)
101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB Dominoes – game played wit ...
- SGU---101 无向图的欧拉回路
题目链接: https://cn.vjudge.net/problem/SGU-101 题目大意: 给定你n张骨牌,每张牌左右两端有一个数字,每张牌的左右两端数字可以颠倒,找出一种摆放骨牌的顺序,使得 ...
- P1341 无序字母对【欧拉路径】- Hierholzer模板
P1341 无序字母对 提交 24.87k 通过 6.80k 时间限制 1.00s 内存限制 125.00MB 题目提供者yeszy 难度提高+/省选- 历史分数100 提交记录 查看题解 标签 福建 ...
- 【USACO 3.3】Riding The Fences(欧拉路径)
题意: 给你每个fence连接的两个点的编号,输出编号序列的字典序最小的路径,满足每个fence必须走且最多走一次. 题解: 本题就是输出欧拉路径. 题目保证给出的图是一定存在欧拉路径,因此找到最小的 ...
- LL谱面分析和难度标定
LL谱面分析和难度标定 先介绍一下LL谱面的存储方式:TimeLine序列(简称TL序列),TL序列中的每一个元素(即音符)可以由一个C语言中的结构体来表示: struct note{ int lin ...
- hdu 3472 HS BDC(混合路的欧拉路径)
这题是混合路的欧拉路径问题. 1.判断图的连通性,若不连通,无解. 2.给无向边任意定向,计算每个结点入度和出度之差deg[i].deg[i]为奇数的结点个数只能是0个或2个,否则肯定无解. 3.(若 ...
- poj 2337 有向图输出欧拉路径
Catenyms Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10186 Accepted: 2650 Descrip ...
- 关于完整解答Leo C.W博客中名为“我们公司的ASP.NET 笔试题,你觉得难度如何”的所有题目
关于完整解答Leo C.W博客中名为“我们公司的ASP.NET 笔试题,你觉得难度如何”的所有题目,请大家鉴定,不足之处,敬请指教! 第1到3题解答如下: public enum QuestionTy ...
- nyoj 42 一笔画问题 欧拉路径
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=42 欧拉回路,欧拉路径水题~ 代码: #include "stdio.h&quo ...
随机推荐
- windows 常用快捷键和dos命令
快捷键 win + R 打开dos命令行窗口 win + E 打开资源管理窗口 (计算机) shift + 鼠标右击 + select 在此处打开命令窗口 可在资源管理目录下打开dos命令 windo ...
- Android widget
1,TextView :走马灯效果 2,EditText ,AutoCompleteText MutiAutoCompleteTextView 3,Button,ImageButton,RadioBu ...
- 安装Qt5.9
目前,作为一个重量级编程开发工具,Qt 已经正式发布了 5.9.0 版本.相比之前的 5.7,5.8 版本,新版本在性能和功能上有了大幅改善和提高,并由此获得了官方的明确表态:这将是继 5.6 之后的 ...
- Linux命令中:rsync和cp之间的区别
rsync:只拷贝那些更新的文件: cp -u:也可以实现类似效果: 两者都基本可以满足备份的需求: 只是一般情况下,用rsync做这类备份之类的事情,更多见: 在备份的操作中,拷贝,过期文件的删除是 ...
- 第十一章 非对称加密算法--DH
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 11.1.非对称加密算法 特点: 发送方和接收方均有一个密钥对(公钥+私钥),其中公 ...
- java数字格式化
[转载] Java 提供 DecimalFormat 类,帮你用最快的速度将数字格式化为你需要的样子.下面是一个例子: importjava.text.DecimalFormat; publiccla ...
- for循环,定时器,闭包混合一块的那点事。
1,对于一个基本的for循环,顺序输出变量值. for(var i = 1; i < 4; i++){ console.log(i);//结果不多说了吧 } 2,如果for循环中有定时器,如下代 ...
- poj 2762 Going from u to v or from v to u? trajan+拓扑
Going from u to v or from v to u? Description In order to make their sons brave, Jiajia and Wind t ...
- Python day17 模块介绍1(time,random)
module模块和包的介绍(略掉了) 常用模块 # time模块 import time print(time.time())#时间戳,在1970年开始到现在一共多少秒 print(time.gmti ...
- django视图函数及快捷方式
视图函数,简称视图,本质上是一个简单的Python函数,它接受Web请求并且返回Web响应. 响应的内容可以是HTML网页.重定向.404错误,XML文档或图像等任何东西.但是,无论视图本身是个什么处 ...