题意:好多木棒,俩端有数字(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 求有重边的无向图欧拉迹的更多相关文章

  1. POJ--1300--Door Man【推断无向图欧拉通路】

    链接:http://poj.org/problem?id=1300 题意:有n个房间.每一个房间有若干个门和别的房间相连.管家从m房间開始走.要回到自己的住处(0),问是否有一条路能够走遍全部的门而且 ...

  2. 求一个极大数的欧拉函数 phi(i)

    思路: 因为当n>=1e10的时候,线性筛就不好使啦.所以要用一个公式 φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn) 证明详见:<公式 ...

  3. 【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论

    http://poj.org/problem?id=2478 题意:给定一个数x,求<=x的数的欧拉函数值的和.(x<=10^6) 题解:数据范围比较大,像poj1248一样的做法是不可行 ...

  4. 筛法求欧拉函数(poj2478

    求1-n的欧拉函数的值 #include <iostream> #include <cstdio> #include <queue> #include <al ...

  5. The Best Path HDU - 5883 欧拉通路

    图(无向图或有向图)中恰好通过所有边一次且经过所有顶点的的通路成为欧拉通路,图中恰好通过所有边一次且经过所有顶点的回路称为欧拉回路,具有欧拉回路的图称为欧拉图,具有欧拉通路而无欧拉回路的图称为半欧拉图 ...

  6. codeforces 1009D Relatively Prime Graph【欧拉函数】

    题目:戳这里 题意:要求构成有n个点,m条边的无向图,满足每条边上的两点互质. 解题思路: 显然1~n这n个点能构成边的条数,就是2~n欧拉函数之和(x的欧拉函数值代表小于x且与x互质的数的个数. 因 ...

  7. COGS2531. [HZOI 2016]函数的美 打表+欧拉函数

    题目:http://cogs.pw/cogs/problem/problem.php?pid=2533 这道题考察打表观察规律. 发现对f的定义实际是递归式的 f(n,k) = f(0,f(n-1,k ...

  8. HDU 2824 简单欧拉函数

    1.HDU 2824   The Euler function 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=2824 3.总结:欧拉函数 题意:求(a ...

  9. HDU5597/BestCoder Round #66 (div.2) GTW likes function 打表欧拉函数

    GTW likes function      Memory Limit: 131072/131072 K (Java/Others) 问题描述 现在给出下列两个定义: f(x)=f_{0}(x)=\ ...

随机推荐

  1. 快学UiAutomator创建第一个实例

    工具准备 一.准备好java环境(JDK)和安卓环境(SDK.ADT)jdk1.6+ \eclipse\SDK \ADT详情百度,安装java环境 二.打开eclipse 三.创建步骤: 右键新建== ...

  2. WINDOWS-API:API函数大全

    操作系统除了协调应用程序的执行.内存分配.系统资源管理外,同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务是一个函数),可以帮肋应用程序达到开启视窗.描绘图形.使用周边设备的目的,由 ...

  3. nonrepetitive DNA|repetitive DNA|moderaly repetitive DNA|highly repetitive DNA|selfish gene|junk DNA

    5.5 真核生物基因组包含非重复DNA序列和重复DNA序列 依据重复序列的频数,可将真核生物DNA做如下分类: 1次即非重复DNA(nonrepetitive DNA,相应的也会更长,随着基因组扩大( ...

  4. Promise中的next 另一个用法

    const chainAsync = fns => { let curr = 0 ; const next = (...args) => fns[curr++](next,...args) ...

  5. 对Java提供的锁机制的一些思考

    Java的数据会在CPU.Register.Cache.Heap和Thread stack之间进行复制操作,而前面四个都是在Java Threads之间共享,因此Java的锁机制主要用于解决Racin ...

  6. 如何创作用纯 CSS 绘制一支栩栩如生的铅笔

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/PaZYBw 可交互视频教 ...

  7. linux定时任务执行php任务

    首先用命令检查服务是否在运行 systemctl status crond.service 如果服务器上没有装有crontab ,则可以执行 yum install vixie-cron yum in ...

  8. leepcode作业解析 - 5-20

    22.缺失数字 给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数. 示例 1: 输入: [3,0,1] 输出: 2 示例 2: 输入: ...

  9. windows中Python多版本与jupyter notebook中使用虚拟环境

    本人电脑是windows系统,装了Python3.7版本,但目前tensorflow支持最新的python版本为3.6,遂想再安装Python3.6以跑tensorflow. 因为看极客时间的专栏提到 ...

  10. LeetCode(72) Edit Distance

    题目 Given two words word1 and word2, find the minimum number of steps required to convert word1 to wo ...