题目链接:

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 无向图的欧拉回路的更多相关文章

  1. sgu 101 无向图有双重边的欧拉路径

    #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> ...

  2. ACM: SGU 101 Domino- 欧拉回路-并查集

    sgu 101 - Domino Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Desc ...

  3. SGU 101

    SGU 101,郁闷,想出来算法,但是不知道是哪个地方的问题,wa在第四个test上. #include <iostream> #include <vector> #inclu ...

  4. hdu 1878 无向图的欧拉回路

    原题链接 hdu1878 大致题意: 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个无向图,问是否存在欧拉回路? 思路: 无向图存在欧拉回路的条件:1.图是连 ...

  5. SGU 101 Domino (输出欧拉路径)

    101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB Dominoes – game played wit ...

  6. SGU 101 Domino【欧拉路径】

    题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=101 题意: N个多米诺骨牌,每个骨牌左右两侧分别有一个0~6的整数(骨牌可以旋转 ...

  7. poj2513Colored Sticks(无向图的欧拉回路)

    /* 题意:将两端涂有颜色的木棒连在一起,并且连接处的颜色相同! 思路:将每一个单词看成一个节点,建立节点之间的无向图!判断是否是欧拉回路或者是欧拉路 并查集判通 + 奇度节点个数等于2或者0 */ ...

  8. SGU 156 Strange Graph 欧拉回路,思路,汉密尔顿回路 难度:3

    http://acm.sgu.ru/problem.php?contest=0&problem=156 这道题有两种点 1. 度数>2 在团中的点,一定连接一个度数为2的点 2. 度数等 ...

  9. sgu 101 Domino 解题报告及测试数据

    101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB 题解: 求多米诺骨牌按照一定方式放置能否使相邻的位置 ...

随机推荐

  1. elasticsearch环境搭建

    学习elasticsearch有一段时间了,整理一些学习的笔记以备忘. 以下内容都是在windows环境下的操作. 一,安装一个较新版本的java,我本地安装的java 8. 二,安装elastics ...

  2. JVM原理自总结

    一.成熟的系统调优1.一定要绝对避免循环查数据库和缓存(PS:循环里面就不能有查询缓存,更不能有查询数据库的操作,因为循环的次数没法控制) 2.对于API接口的话,一般都是直接查缓存的,没有查数据库的 ...

  3. SpringBoot 入门(一)

    1. 什么是SpringBoot? SpringBoot是一个快速开发框架,能够帮我们快速整合第三方框架(Maven依赖关系##Maven继承),完全采用注解化,简化XML配置,内置嵌入Http服务器 ...

  4. IDEA 构建为了打 jar 包的工程,包含 maven 打 jar 包的过程

    前言:最近自己写了一个单表查询的组件,包含前端.后台,所以需要向阿里的 druid 一样将所有文件打到一个 jar 包里,这里首先记录如何打 jar 包. 附:自己的一个 jar 包源码 https: ...

  5. 零基础全面学习HTML

    基础框架 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" co ...

  6. opencv3.2.0图像处理之方框滤波boxFilter API函数

    /*.1.方框滤波:boxFilter函数(注:均值滤波是归一化后的方框滤波)*/ /*函数原型: void boxFilter(InputArray src, OutputArray dst, in ...

  7. 玩转Android拍摄功能

    简单拍照与摄像 在富媒体开始流行之前,整个世界是一个灰暗且平淡无奇的地方.还记得Gopher吗?我或许不记得了.自从APP成为用户生活的一部分之后,这便给他们提供了一种方式可以来存放他们生活的细节.使 ...

  8. 解决提交项目到GitHub,报错Please tell me who you are的问题

    描述: 在第一次提交项目到GitHub时,出现了以下问题 看了一下错误原因:Run git config --global user.email "you@example.com" ...

  9. url override implements session

    url 重写实现会话概述 URL重写是对GET请求参数的应用,当服务器响应浏览器上一次请求时,将某些相关信息以超链接方式响应给浏览器,超链接中包括请求参数信息. 特点:URL必须以GET方式发送请求. ...

  10. 关于removeChild

    var a=document.body; document.body.parentNode.removeChild(a) console.log(a); a的内容还是body???whY