Domino - SGU 101 (欧拉路径)
题目大意:这是一个多米诺骨游戏,这个游戏的规则就是一个连着一个,现在给出 N 个多米诺,每个多米诺两边都有一个编号,相邻的多米诺的编号要一致,当然多米诺是可以翻转的(翻转就加‘-’,不翻转是‘+’),输出一个多米诺的顺序,要从左往右。
分析:开始的是有以为是二分匹配,然后发现并不能匹配,无法分成两个集合,网络流也不能搞,最后百度才知道是欧拉路径(从一点出发经过所有的路径,每条路只走一次),这个算法倒也不难理解,感觉很巧妙,如果点的入度都是偶数的话,那么就是欧拉回路(可以从一个点出发然后,最后还可以回到这个点结束),如果把所有的多米诺的编号当做节点,那么每个多米诺就是一条边,问题就转换成裸的欧拉路径题目了,判断是否是欧拉路径的时候需要注意,这个图是否是联通的。
代码如下:
===================================================================================================
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; const int MAXN = ; struct Bridge
{
int u, v, next;
int id, used;
}edge[MAXN];
int Head[MAXN], cnt; int ans[MAXN], na; void AddEdge(int u, int v, int id)
{
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].id = id;
edge[cnt].used = false;
edge[cnt].next = Head[u];
Head[u] = cnt++; swap(u, v); edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].id = id;
edge[cnt].used = false;
edge[cnt].next = Head[u];
Head[u] = cnt++;
} void DFS(int k)
{
for(int i=Head[k]; i!=-; i=edge[i].next)
{
if(edge[i].used == false)
{
edge[i].used = edge[i^].used = true;
DFS(edge[i].v);
ans[na++] = i;
}
}
} int main()
{
int N, u, v; scanf("%d", &N); memset(Head, -, sizeof(Head));
cnt = , na=; int ru[MAXN] = {}, index=; for(int i=; i<=N; i++)
{
scanf("%d%d", &u, &v);
AddEdge(u, v, i);
ru[u]++, ru[v]++; index = u;
} int sum = ; for(int i=; i<; i++)
{
if(ru[i] % )
{
sum ++;
index = i;
}
} if(sum != && sum != )
printf("No solution\n");
else
{
DFS(index); if(na != N)
printf("No solution\n");
else
{
for(int i=; i<na; i++)
printf("%d %c\n", edge[ans[i]].id, ans[i]% ? '+' : '-');
}
} return ;
}
Domino - SGU 101 (欧拉路径)的更多相关文章
- ACM: SGU 101 Domino- 欧拉回路-并查集
sgu 101 - Domino Time Limit:250MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u Desc ...
- SGU 101
SGU 101,郁闷,想出来算法,但是不知道是哪个地方的问题,wa在第四个test上. #include <iostream> #include <vector> #inclu ...
- SGU 101 Domino (输出欧拉路径)
101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB Dominoes – game played wit ...
- SGU 101.Domino( 欧拉路径 )
求欧拉路径...直接dfs即可,时间复杂度O(N) -------------------------------------------------------------------------- ...
- SGU 101 Domino【欧拉路径】
题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=101 题意: N个多米诺骨牌,每个骨牌左右两侧分别有一个0~6的整数(骨牌可以旋转 ...
- sgu 101 Domino 解题报告及测试数据
101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB 题解: 求多米诺骨牌按照一定方式放置能否使相邻的位置 ...
- SGU 101.Domino (欧拉路)
时间限制: 0.5 sec 空间限制: 4096 KB 描述 多米诺骨牌,一种用小的方的木块或其他材料,每个都被一些点在面上标记,这些木块通常被称为骨牌.每个骨牌的面都被一条线分成两个 方形,两边 ...
- SGU 101 Domino 题解
鉴于SGU题目难度较大,AC后便给出算法并发布博文,代码则写得较满意后再补上.——icedream61 题目简述:暂略 AC人数:3609(2015年7月20日) 算法: 这题就是一笔画,最多只有7个 ...
- sgu 101 无向图有双重边的欧拉路径
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> ...
随机推荐
- 数组转换成json
下面是详细的步骤,也可参考http://blog.csdn.net/wangliqiang1014/article/details/19924727 iOS数组可以转换车json对象,转换代码:NSS ...
- LINQ 101——约束、投影、排序
什么是LINQ:LINQ 是一组 .NET Framework 扩展模块集合,内含语言集成查询.集合以及转换操作.它使用查询的本机语言语法来扩展 C# 和 Visual Basic,并提供利用这些功能 ...
- java设计模式——接口模式
java将接口的概念提升为独立的结构,体现了接口与实现分离.java接口允许多个类提供相同的功能,也允许一个同时实现多个接口.java的接口与抽象类十分相似.java与抽象类中的区别: 1.一个类可以 ...
- jquery 属性与css操作
属性1.属性 1.1 attr(name|properties|key,value|key,fn) 1) 获取属性值 $("img").attr(&quo ...
- HttpWebRequest 写入报错
HttpWebRequest以UTF-8编码写入内容时发生“Bytes to be written to the stream exceed the Content-Length bytes size ...
- CSS and JavaScript Bundling and Minification in ASP.NET 4.5
ASP.NET 4.5 includes a new feature to minify and bundle CSS and JavaScript within your web applicati ...
- ntpath join(path, *paths) 发生UnicodeDecodeError的Bug的解决方案
最近在学习用Python开发web,使用的是web框架,在win8.1平台下安装SAE和Flask的时候总是在ntpath.py这个UnicodeDecodeError模块报错. 84行 result ...
- VS2012编译生成XP可以执行的程序
首先需要的就是下载VS2012的Update 4更新包,然后打开项目的属性页,在 配置属性->平台工具集 选项中选择 Visual Studio 2012 - Windows XP (v110_ ...
- BASLER 镜头选型白皮书
本文翻译自Basler镜头选型白皮书 有许多方法来进行镜头选型.本文将会讨论其中的指导原则,以帮助你在项目中选择合适的镜头.我们将讨论许多镜头的基本概念,比如镜头接口.图像大小.放大率.焦距.F数和光 ...
- golang开发android环境搭建_window
golang开发android环境搭建介绍 一 安装依赖软件: git:版本管理 go: go开发环境(版本>=1.5),可直接下载window版的go安装包. android studio: ...