SGU101 求有重边的无向图欧拉迹
题意:好多木棒,俩端有数字(0--6)标记,按数字相同的端首尾相连成一条直线(木棒可以相同)。即求有重边的无向图欧拉迹。
先判定是否为欧拉图,俩个条件,不说了。如果是欧拉图,输出路经。
方法:dfs遍历边,回溯时候记录边,遍历过了就标记“双向边”.
那么所记录的恰好是一条逆欧拉迹。不可以前进的时候标记,原因:有可能一笔画失败,导致边不连续,
而回溯的时候记录,原因较复杂,大致证明如下:
分几种情况讨论即可:
1,只有偶数结点。任选一个点,必然从一条出发回到该点,直到无边为止,回溯时边自然连续。
2,有2个奇数结点。当回到某个点时无论圈有没走,必然也连续,见图:




#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;int nume=0;
int e[205][2];int head[10];
void adde(int f,int l)
{
e[nume][0]=l;e[nume][1]=head[f];head[f]=nume++;
e[nume][0]=f;e[nume][1]=head[l];head[l]=nume++;
}
int degree[8]; //度数
int vis[205]; //标记访问
void dfs1(int u) //判断连通
{
for(int i=head[u];i!=-1;i=e[i][1])
{
int v=e[i][0];
if(!vis[v])
{
vis[v]=1;
dfs1(v);
}
}
}
int ans[205][2];int ansnum=0;
void dfs2(int u) //求欧拉迹
{
for(int i=head[u];i!=-1;i=e[i][1])
{
if(!vis[i])
{
vis[i]=1; //此处同时标记双向边!!!。
vis[i^1]=1;
int v=e[i][0];
dfs2(v); //回溯的时候记录边,恰是一条欧拉路。
if(i%2==0)
ans[ansnum++][0]=i/2+1;
else
ans[ansnum++][1]=i/2+1; }
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<8;i++)
head[i]=-1;
int tf,tl;
int tbegin=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&tf,&tl);
tbegin=tf;
degree[tf]++;degree[tl]++;
adde(tf,tl);
}
int count=0;
int jis=0;;
for(int i=0;i<=6;i++) //度数判定
{
if(degree[i]%2)
{
count++;
jis=i;
}
}
if(count==0||count==2)
{
int mark=1;
vis[tbegin]=1;
dfs1(tbegin);
for(int i=0;i<=6;i++) //连通性判定
if(vis[i]==0&°ree[i]>0)
mark=0;
if(mark==0){ printf("No solution\n");return 0;}
for(int i=0;i<205;i++)
vis[i]=0;
if(count==0)
dfs2(tbegin);
else
dfs2(jis);
for(int i=ansnum-1;i>=0;i--) //逆序输出
{
if(ans[i][0]!=0)
printf("%d +\n",ans[i][0]);
else
printf("%d -\n",ans[i][1]);
}
}
else
printf("No solution\n"); }
SGU101 求有重边的无向图欧拉迹的更多相关文章
- POJ--1300--Door Man【推断无向图欧拉通路】
链接:http://poj.org/problem?id=1300 题意:有n个房间.每一个房间有若干个门和别的房间相连.管家从m房间開始走.要回到自己的住处(0),问是否有一条路能够走遍全部的门而且 ...
- 求一个极大数的欧拉函数 phi(i)
思路: 因为当n>=1e10的时候,线性筛就不好使啦.所以要用一个公式 φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn) 证明详见:<公式 ...
- 【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论
http://poj.org/problem?id=2478 题意:给定一个数x,求<=x的数的欧拉函数值的和.(x<=10^6) 题解:数据范围比较大,像poj1248一样的做法是不可行 ...
- 筛法求欧拉函数(poj2478
求1-n的欧拉函数的值 #include <iostream> #include <cstdio> #include <queue> #include <al ...
- The Best Path HDU - 5883 欧拉通路
图(无向图或有向图)中恰好通过所有边一次且经过所有顶点的的通路成为欧拉通路,图中恰好通过所有边一次且经过所有顶点的回路称为欧拉回路,具有欧拉回路的图称为欧拉图,具有欧拉通路而无欧拉回路的图称为半欧拉图 ...
- codeforces 1009D Relatively Prime Graph【欧拉函数】
题目:戳这里 题意:要求构成有n个点,m条边的无向图,满足每条边上的两点互质. 解题思路: 显然1~n这n个点能构成边的条数,就是2~n欧拉函数之和(x的欧拉函数值代表小于x且与x互质的数的个数. 因 ...
- COGS2531. [HZOI 2016]函数的美 打表+欧拉函数
题目:http://cogs.pw/cogs/problem/problem.php?pid=2533 这道题考察打表观察规律. 发现对f的定义实际是递归式的 f(n,k) = f(0,f(n-1,k ...
- HDU 2824 简单欧拉函数
1.HDU 2824 The Euler function 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=2824 3.总结:欧拉函数 题意:求(a ...
- HDU5597/BestCoder Round #66 (div.2) GTW likes function 打表欧拉函数
GTW likes function Memory Limit: 131072/131072 K (Java/Others) 问题描述 现在给出下列两个定义: f(x)=f_{0}(x)=\ ...
随机推荐
- (11)zabbix item types监控类型
1. 什么是item types item types是由zabbix提供的各种类型的检查器(这样翻译很奇怪),大致就是Zabbix agent, Simple checks, SNMP, Zabbi ...
- Django之学员管理一
Django之学员管理一 建表结构: #班级表class: id title 1 五年一班 2 五年二班 3 五年三班 4 五年四班 #学生表student: id name 班级ID(FK外键) 1 ...
- (转)automaticallyAdjustsScrollViewInsets(个人认为iOS7中略坑爹的属性)
转自http://m.blog.csdn.net/blog/humingtao2013/27662093 automaticallyAdjustsScrollViewInsets(个人认为iOS7中略 ...
- u-boot顶层目录config.mk分析
1. 设置obj与src ifneq ($(OBJTREE),$(SRCTREE)) ifeq ($(CURDIR),$(SRCTREE)) dir := else dir := $(subst $( ...
- Ubuntu 16.04上thunderbird配置163邮箱出现“配置无法被验证-请查看用户名或密码是否正确?”
在Ubuntu 16.04 上用thunderbird配置163免费邮箱时出现的提示信息如图1: 图1 提示信息 网上有不少方法都说是将接收和发出的主机名分别改为 imap.ym.163.com 和 ...
- Java-从一个字符串获取子字符串
substring函数 package com.tj; public class MyClass implements Cloneable { public static void main(Stri ...
- python linux安装anaconda
步骤: 1.在清华大学镜像站中下载anaconda版本:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ https://mirrors.t ...
- BZOJ 1861 [Zjoi2006]Book 书架 ——Splay
[题目分析] 模板题目. 首尾两个虚拟结点,十分方便操作. [代码] #include <cstdio> #include <cstring> #include <cma ...
- 【bzoj2115】[Wc2011] Xor【高斯消元】
题目大意:给出一个无向有权图,找出一条从1到n的路径,使得路径上权值的异或和最大,路径可以重复走 Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条 ...
- P3147 [USACO16OPEN]262144 (贪心)
题目描述 给定一个1*n的地图,在里面玩2048,每次可以合并相邻两个(数值范围1-262,144),问最大能合出多少.注意合并后的数值并非加倍而是+1,例如2与2合并后的数值为3. 这道题的思路: ...