题目大意:https://www.cnblogs.com/Juve/articles/11207540.html—————————>

题解:网上都是一句话题解:将所有的边拆成两条,问题变成去掉两条边,使得原图存在一条欧拉路径。注意新图中所有点的度数均为偶数,只需按照去掉任意2个自环、去掉任意1个自环和任意一条边、去掉两条有公共顶点的边进行讨论即可。注意图不连通的判断方式,不是点不连通,而是边不连通。

这显然十分晦涩难懂

题目要求m-2条边经过两次,2条边经过1次。

如果不考虑有两条边经过一次,那么把所有边经过两次就是走一个欧拉路,由起点走向终点

那么2条边经过一次怎么理解?就是由终点往回倒2条边

我们首先判断图的连通性,用并查集即可,但要判定单独的一个点在图的外面,没有任何边与它连通的情况(你也可以理解成只要所有的边在一个集合里就可以,不一定所有的点在同一集合中)

那么往回倒的这两条边有什么情况?

题中没有说不存在自环,那么倒回去的这两条边有三种情况:

1,两个自环

2,一个自环和一条非自环边

3,两条连在同一点的边

我们定义du[i]为不考虑自环情况下i的度,tot是自环的个数,

sum=($\sum_\limits{i=1}^{n}$du[i])/2,(除以2是因为一条边连接了两个点,所以会算重)

对于第一种情况,ans1=tot*(tot-1)/2(等价与从tot个自环选出2个不重复的,$C_{tot}^{2}$)

第二种情况:ans2=tot*sum(自环中选一个,非自环边选一个)

第三中情况:ans3=$\sum_\limits{i=1}^{n}$du[i]*(du[i]-1)/2(从与i相连的边中选出不重复的两条,$C_{du[i]}^{2}$)。

最终的答案就是三种情况相加。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#define MAXN 100005
#define ll long long
using namespace std;
ll fa[MAXN],n,m,du[MAXN],tot_c=0,ans=0,du2[MAXN],rt,sum=0;
ll find(ll x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void unionn(ll x,ll y){
int a=find(x),b=find(y);
fa[a]=b;
}
int main(){
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++) fa[i]=i;
for(ll i=1,u,v;i<=m;i++){
scanf("%lld%lld",&u,&v);
if(u!=v){
unionn(u,v);
du[v]++,du[u]++;
}else tot_c++;
du2[v]++,du2[u]++;
}
for(ll i=1;i<=n;i++){
if(du2[i]){
rt=find(i);
break;
}
}
for(ll i=1;i<=n;i++){
if(rt!=find(i)&&du2[i]){
printf("0\n");
return 0;
}
}
for(ll i= 1;i<=n;i++)
ans+=du[i]*(du[i]-1)/2,sum+=du[i];
sum/=2;
ans+=tot_c*sum;
ans+=tot_c*(tot_c-1)/2;
printf("%lld\n",ans);
return 0;
}

ps:对于需要开long long的题我都是把所有变量全变成long long类型

HZOI2019 星际旅行 欧拉路的更多相关文章

  1. 星际旅行(欧拉路,欧拉回路)(20190718 NOIP模拟测试5)

    瞎搞了一个ans+=du*(du-1)/2 wa20分,好桑心(话外音:居然还有二十分,出题人太周到了) 还是判欧拉路 题解没太仔细想,感觉还是kx的思路明白 具体就是:因为每条边要走两遍,可以把一条 ...

  2. [CSP-S模拟测试]:星际旅行(欧拉路)

    题目传送门(内部题4) 输入格式 第一行两个整数$n,m$,表示行星和虫洞的数量.接下来$m$行,每行两个整数$u,v$,表示存在一个双向虫洞直接连接$u$和$v$.每一个虫洞最多会被描述一次. 输出 ...

  3. 洛谷P1341 无序字母对[无向图欧拉路]

    题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...

  4. POJ1386Play on Words[有向图欧拉路]

    Play on Words Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11846   Accepted: 4050 De ...

  5. hdu1161 欧拉路

    欧拉路径是指能从一个点出发能够“一笔画”完整张图的路径:(每条边只经过一次而不是点) 在无向图中:如果每个点的度都为偶数 那么这个图是欧拉回路:如果最多有2个奇数点,那么出发点和到达点必定为该2点,那 ...

  6. UVA10054The Necklace (打印欧拉路)

    题目链接 题意:一种由彩色珠子组成的项链.每个珠子的两半由不同的颜色组成.相邻的两个珠子在接触的地方颜色相同.现在有一些零碎的珠子,需要确定他们是否可以复原成完整的项链 分析:之前也没往欧拉路上面想, ...

  7. 洛谷 P1341 无序字母对 Label:欧拉路 一笔画

    题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...

  8. POJ 1637 Sightseeing tour (混合图欧拉路判定)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6986   Accepted: 2901 ...

  9. hihocoder 1181 欧拉路.二

    传送门:欧拉路·二 #1181 : 欧拉路·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其 ...

随机推荐

  1. Windows cd

    显示当前目录名或改变当前目录. CHDIR [/D] [drive:][path]CHDIR [..]CD [/D] [drive:][path]CD [..] ..   指定要改成父目录. 键入 C ...

  2. Docker保存日志到本地

    其实很简单 docker logs +你需要添加的额外参数 + 容器id >文件名称 然后查看这个文件就可以了,也可以通过ftp协议下载到本地

  3. 异或前缀和——cf1186C

    很思维的题,b的1个数和c的1个数相差为偶数时,必定有偶数个不同 反之必定有奇数个不同 #include <iostream> #include <cstdlib> #incl ...

  4. PSCC2019常用基础操作

    一.常用设置 1.界面设置(快捷键Ctrl+K):可以对PS界面的颜色.导出格式.性能等等进行设置(这里暂存盘建议设置D盘或F盘,默认C盘). 2.常用面板整理(菜单栏->窗口) 二.常用快捷键 ...

  5. Python入门教程 超详细1小时学会Python

    Python入门教程 超详细1小时学会Python 本文适合有经验的程序员尽快进入Python世界.特别地,如果你掌握Java和Javascript,不用1小时你就可以用Python快速流畅地写有用的 ...

  6. 普通的maven项目变成web项目

    command+: 或者 这个修改同样可以解决idea中不能新建servlet的问题. 这里最后的目录结构是这样的,如果在上面的设置中尝试修改目录,会导致无法创建servlet,比如我希望将根目录改成 ...

  7. Apache服务器性能如何优化

    配置网站,要充分的把系统资源利用出去,榨干系统的一切潜能,让网站速度发挥到极致.Apache,是用户浏览和网站数据的一个中间桥梁.但是在这里,我们虽然做得并不是很多,但是如果心细打理,有些设置也会起到 ...

  8. Window中在Intellij idea开发时常用快捷键

    以下idea中的快捷键是在window 7中确认过,如果快捷键不起作用,可能是该快捷键被其它软件占用,或系统不同导致. 1.Ctrl + Z:撤回代码: 2.Ctrl + Shift + Z:恢复撤回 ...

  9. 03_mybatis配置文件详解

    1. SqlMapConfig.xml mybatis全局配置文件SqlMapConfig.xml,配置内容如下: *properties(属性) setting(全局配置参数) typeAliase ...

  10. C# 16进制与字符串、字节数组之间的转换(串口通讯中)

    1.c#中如何将十进制数的字符串转化成十六进制数的字符串//十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString( ...