SGU---101 无向图的欧拉回路
题目链接:
https://cn.vjudge.net/problem/SGU-101
题目大意:
给定你n张骨牌,每张牌左右两端有一个数字,每张牌的左右两端数字可以颠倒,找出一种摆放骨牌的顺序,使得相邻骨牌的两端数字相同(最左边骨牌的最左端和最右边骨牌的最右端可以不管)。
解题思路:
直接求解无向图的欧拉回路即可。 欧拉回路相关定理
此处建模把每张牌看做一条边,牌左右两端的数字为起点和终点。存边的时候存两条,一条正向边,一条反向边
首先判断度数关系,存在欧拉道路回路的条件是连通图不存在或者仅存在两个奇度顶点。
注意DFS找欧拉路径后存入ans栈中,需要判断ans内存入的边的数量是否为n,不为n则图不连通。
简单题,但是一个小细节出错,就是下述代码中找起点s的那里写错了。Wa了好几次
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> Pair;//first存终点,second存编号,正向边存正编号,反向边存负编号
vector<Pair>G[];//邻接表存图
int num[];//度数
bool vis[];//某条边是否已经遍历
stack<int>ans;//欧拉道路
void euler(int u)
{
for(int i = ; i < G[u].size(); i++)
{
int v = G[u][i].first;
int id = G[u][i].second;
if(!vis[abs(id)])
{
vis[abs(id)] = ;
euler(v);
ans.push(id);
}
}
}
int main()
{
int n, u, v;
scanf("%d", &n);
for(int i = ; i <= n; i++)
{
scanf("%d%d", &u, &v);
num[u]++, num[v]++;
G[u].push_back(Pair(v, i));
G[v].push_back(Pair(u, -i));
}
int tot = ;
for(int i = ; i <= ; i++)//注意选择起点
if(num[i] & )tot++;
if(tot == || tot == )
{
int s;//选择起点时要分类讨论 不然选到的点可能不是奇度顶点或者是度数为0的点
if(tot)
{
for(int i = ; i <= ; i++)
if(num[i] & )s = i;
}//此处没有花括号的话,else和循环内的if配对,之前没写这个一直WA
else
for(int i = ; i <= ; i++)if(num[i])s = i;
euler(s);
if(ans.size() != n)//图不连通
{
printf("No solution\n");
return ;
}
while(!ans.empty())
{
if(ans.top() > )
printf("%d +\n", ans.top());
else printf("%d -\n", -ans.top());
ans.pop();
}
}
else printf("No solution\n");
return ;
}
SGU---101 无向图的欧拉回路的更多相关文章
- sgu 101 无向图有双重边的欧拉路径
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> ...
- 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 ...
- hdu 1878 无向图的欧拉回路
原题链接 hdu1878 大致题意: 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个无向图,问是否存在欧拉回路? 思路: 无向图存在欧拉回路的条件: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 Domino【欧拉路径】
题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=101 题意: N个多米诺骨牌,每个骨牌左右两侧分别有一个0~6的整数(骨牌可以旋转 ...
- poj2513Colored Sticks(无向图的欧拉回路)
/* 题意:将两端涂有颜色的木棒连在一起,并且连接处的颜色相同! 思路:将每一个单词看成一个节点,建立节点之间的无向图!判断是否是欧拉回路或者是欧拉路 并查集判通 + 奇度节点个数等于2或者0 */ ...
- SGU 156 Strange Graph 欧拉回路,思路,汉密尔顿回路 难度:3
http://acm.sgu.ru/problem.php?contest=0&problem=156 这道题有两种点 1. 度数>2 在团中的点,一定连接一个度数为2的点 2. 度数等 ...
- sgu 101 Domino 解题报告及测试数据
101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB 题解: 求多米诺骨牌按照一定方式放置能否使相邻的位置 ...
随机推荐
- 008.在C#中,显式接口VS隐式接口
原文http://www.codeproject.com/Articles/1000374/Explicit-Interface-VS-Implicit-Interface-in-Csharp (At ...
- SpringMVC中数据转换
SpringMVC中接收到的数据都是String形式,然后再根据反射机制将String转换成对应的类型.如果此时想接收一个Date类型,那么我们可以定义一个转换器来完成. 例如,我们有下面的Emp类: ...
- JDBC程序优化--提取配置信息放到属性文件中
JDBC程序优化--提取配置信息放到属性文件中 此处仅仅优化JDBC连接部分,代码如下: public class ConnectionFactory { private static String ...
- 高并发第十三弹:J.U.C 队列 SynchronousQueue.ArrayBlockingQueue.LinkedBlockingQueue.LinkedTransferQueue
因为下一节会说线程池,要用线程池 那么线程池有个很重要的参数 就是Queue的选择 常用的队列其实就两种: 先进先出(FIFO):先插入的队列的元素也最先出队列,类似于排队的功能.从某种程度上来说这种 ...
- vue 如何将输入框的输入自动小写转大写(使用 v-model 时采取另一种方式)
前言:小写转大写,可以用过滤器实现,但当使用 v-model 时就不行了,这里有解决方案.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9289205.html ...
- C# SpinWait
其实SpinWait的code 非常简单,以前看过很多遍,但是从来都没有整理过,整理也是再次学习吧. 我们先看看SpinWait的一些评论或者注意点吧:如果等待某个条件满足需要的时间很短,而且不希望发 ...
- 弹窗中使用jquery ui的autocomplete自动完成插件无效果 实际是被遮挡了
在普通页面上使用jquery ui的autocomplete自动完成插件时正常显示提供选择的下拉框,但是放到弹窗中的时候就无法显示这个选择的下拉框,其它效果正常: 估计是被弹出窗遮挡了,网络搜索了jq ...
- jquery3.0移除了.load()方法
参考链接:新版jquery去掉load事件了吗? 今天也遇到了这个问题,查了一下文档,确实从3.0开始移除了load.unload.error事件方法.不过依然可以用on方法绑定这些事件. Break ...
- 如何配置Portal 基于AD的单点登录配置
Portal for ArcGIS支持两种类型的账户,分别是: 1.系统内置账户. 2.外部系统的企业账户. 这两种不同的账号分别支持多种身份认证方式: 账号类型 认证方式 细分认证方式 系统内置账号 ...
- js获取当前页面url信息方法(JS获取当前网址信息)
设置或获取对象指定的文件名或路径. alert(window.location.pathname) 设置或获取整个 URL 为字符串. alert(window.location.href); 设置或 ...