题目链接:

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. MVC初级教程(二)

    演示产品源码下载地址:http://www.jinhusns.com/Products/Download 

  2. gRPC 的 RoadMap 20151022 更新

    gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发 ...

  3. 给model模型传数组参数

    $res = $this->Company->companyDischarge($this->user_id,array(0=>'c.limit_sum>0',1=> ...

  4. 1px边框的渐变

    <div class="box">banner</div> .box { width: 100px; height: 50px; line-height: ...

  5. JS将秒换成时分秒实现代码 [mark]

    将秒换成时分秒的方法有很多,在本文将为大家介绍下,使用js的具体的实现思路,有需要的朋友可以参考下,希望对大家有所帮助 http://www.jb51.net/article/41098.htm fu ...

  6. VMware桥接模式下主机和和虚机间互相ping不通的处理方法

    在 "编辑"->"虚拟网络编辑器" 里面的vmnet0 桥接模式 里面是自动连接,把他改为真实的物理网卡即可,如下图:

  7. 1000! mod 10^250

    1000! mod 10^250  =============== the answer is 2 ================ Hi I'm trying to solve the above ...

  8. struts2 开发模式

    在struts.xml中增加: <constant name="struts.devMode" value="true" />

  9. 请求包含(Include)和请求转发(Forward)

    定义 请求包含是指将另一个Servlet的请求处理流程包含进来. 请求转发是指将请求转发给别的Servlet处理. 实现 实现请求包含和请求转发,可以使用HttpServletRequest的getR ...

  10. Eclipse创建第一个Servlet(Dynamic Web Project方式)、第一个Web Fragment Project(web容器向jar中寻找class文件)

    创建第一个Servlet(Dynamic Web Project方式) 注意:无论是以注解的方式还是xml的方式配置一个servlet,servlet的url-pattern一定要以一个"/ ...