[CSP-S模拟测试]:星际旅行(欧拉路)
题目传送门(内部题4)
输入格式
第一行两个整数$n,m$,表示行星和虫洞的数量。
接下来$m$行,每行两个整数$u,v$,表示存在一个双向虫洞直接连接$u$和$v$。
每一个虫洞最多会被描述一次。
输出格式
一行一个整数,代表本质不用的航线的数量。
样例
样例输入
5 4
1 2
1 3
1 4
1 5
样例输出
6
数据范围与提示
样例解释:
本质不同的航线有$6$条:
2-1-3-1-4-1-5
2-1-3-4-5-1-4
2-1-4-1-5-1-3
3-1-2-1-5-1-4
3-1-2-1-4-1-5
4-1-2-1-3-1-5
注意2-1-4-1-3-1-5不是另一个本质不同的航线,它与第一条航线是本质相同的。
限制与约定:
对于$10\%$的数据,$n,m \leqslant 5$。
对于$20\%$的数据,$n,m \leqslant 10$。
对于$40\%$的数据,$n,m \leqslant 100$。
对于$60\%$的数据,$n,m \leqslant 1000$。
对于所有的数据,$1 \leqslant n,m \leqslant {10}^5,1 \leqslant u,v \leqslant n$。
题解
将所有的边拆成两条,问题变成删掉两条边,使得剩下的图是一个欧拉路或者是欧拉回路。
则分为三种情况:
1.删掉两个自环:删掉两个自环,这两个点的度数都$-2$,成为一个欧拉回路,假设这样的点有$sum$个,则方案数为$C_{sum}^2$。
2.删掉一个自环和一条边:删自环上面已经说明了,考虑删边,删去一条边则这两个点的度数$-1$,变为两个奇数点,成为一个欧拉路,方案数为$C_{sum}^2 \times (m-sum)$。
3.删掉有一个公共点的两条边:该点的度数$-2$,两条边分别连接的另两个点的度数分别$-1$,成为一个欧拉路,方案数为$\sum \limits_{i=1}^n C_{d[i]}^2$。
则总的方案数为:$C_{sum}^2 + C_{sum}^2 \times (m-sum) + \sum \limits_{i=1}^n C_{d[i]}^2$。
至于计算过程,显然上面的方法不方便计算,那么我们考虑转化一下计算的思路。
将情况$1$和情况$2$和起来,则第一个自环可以与剩余边结合,方案数为$m-1$,第二个自环贡献的方案数为$m-2$,根据高中课本中等差数列求和公式可得方案数为:$\frac{(2 \times m-sum-1) \times sum}{2}$。
情况3的方案数为:$\frac{\sum \limits_{i=1}^n d[i] \times (d[i]-1)}{2}$,扫一边即可求出。
注意图不连通的判断方式,不是点不连通,而是边不连通,可以使用并差集判断,不联通方案数为$0$。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,m;
int rd_geq[100001],rd_leq[100001],f[100001];
long long ans,sum;
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
void connect(int x,int y){f[find(x)]=find(y);}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
rd_leq[x]++;//所有的度
rd_leq[y]++;
if(x==y)sum++;//统计自环
else
{
rd_geq[x]++;//非自环的度
rd_geq[y]++;
connect(x,y);
}
}
int flag=0;
for(int i=1;i<=n;i++)
if(rd_leq[i])
{
flag=i;
break;
}
for(int i=1;i<=n;i++)
{
if(rd_leq[i]&&find(i)!=f[flag])
{
puts("0");
return 0;
}
ans+=1LL*(rd_geq[i]-1)*rd_geq[i]/2;//第3种情况
}
ans+=sum*(m-sum)+sum*(sum-1)/2;//第1种和第2种情况
printf("%lld",ans);
return 0;
}
rp++
[CSP-S模拟测试]:星际旅行(欧拉路)的更多相关文章
- HZOI2019 星际旅行 欧拉路
题目大意:https://www.cnblogs.com/Juve/articles/11207540.html—————————> 题解:网上都是一句话题解:将所有的边拆成两条,问题变成去掉两 ...
- 星际旅行(欧拉路,欧拉回路)(20190718 NOIP模拟测试5)
瞎搞了一个ans+=du*(du-1)/2 wa20分,好桑心(话外音:居然还有二十分,出题人太周到了) 还是判欧拉路 题解没太仔细想,感觉还是kx的思路明白 具体就是:因为每条边要走两遍,可以把一条 ...
- [CSP-S模拟测试]:组合(欧拉路)
题目传送门(内部题119) 输入格式 第一行,三个整数$T,M,N$. 接下来的$N$行,每行两个整数$u_i,v_i$($i$从$1$开始编号).允许$u_i=v_i$,也允许同样的简单词多次出现. ...
- 7.18 NOIP模拟测试5 星际旅行+砍树+超级树
T1 星际旅行 题意:n个点,m条边,无重边,有自环,要求经过m-2条边两次,2条边一次,问共有多少种本质不同的方案.本质不同:当且仅当至少存在一条边经过次数不同. 题解:考试的时候理解错题,以为他是 ...
- NOIP模拟测试5「星际旅行·砍树·超级树」
星际旅行 0分 瞬间爆炸. 考试的时候觉得这个题怎么这么难, 打个dp,可以被儿子贡献,可以被父亲贡献,还有自环,叶子节点连边可以贡献,非叶子也可以贡献,自环可以跑一回,自环可以跑两回, 关键是同一子 ...
- [7.18NOIP模拟测试5]星际旅行 题解
题面(加密) 考场上靠打表yy出的规律进而想到的正解233333 可以把一条双向边拆成两条单向边,这样的话每个点度数都为偶数,符合欧拉图的定义. 那么题目可以转化为:去掉两条边,使图中存在一条欧拉路. ...
- noip模拟8[星际旅行·砍树·超级树·求和]
也不能算考得好,虽然这次A了一道题,但主要是那道题太简单了,没啥成就感,而且有好多人都A掉了 除了那一道,其他的加起来一共拿了25pts,这我能咋办,无奈的去改题 整场考试的状态并不是很好啊,不知道是 ...
- 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]
6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...
- SGU 101.Domino (欧拉路)
时间限制: 0.5 sec 空间限制: 4096 KB 描述 多米诺骨牌,一种用小的方的木块或其他材料,每个都被一些点在面上标记,这些木块通常被称为骨牌.每个骨牌的面都被一条线分成两个 方形,两边 ...
随机推荐
- c++ 取整:四舍五入 向上取整 向下取整
对于数据的取整是经常需要考虑的 现在总结如下 #include<iostream> #include<cmath> using namespace std; int main( ...
- PostgreSQL dblink使用过程
安装: 进入/root/postgresql-11.2/contrib/dblink make && make install 切换到postgres用户 [root@fce40690 ...
- mysql 修改表字段默认值
alter table 表名 alter column 字段名 drop default; (若本身存在默认值,则先删除) alter table 表名 alter column 字段名 set de ...
- 数据库允许空值(null),往往是悲剧的开始 (转)
数据库字段允许空值,会遇到一些问题,此处包含的一些知识点,和大家聊一聊. 数据准备: create table user ( id int, name varchar(20), index(id) ) ...
- 深入理解 JavaScript中的变量、值、传参
1. demo 如果你对下面的代码没有任何疑问就能自信的回答出输出的内容,那么本篇文章就不值得你浪费时间了. var var1 = 1 var var2 = true var var3 = [1,2, ...
- 通过编写串口助手工具学习MFC过程——(七)添加Tab Control控件
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- FFmpeg SDK开发模型之中的一个:解码器
简单介绍 本例解说了怎样使用ffmpeg SDK解码媒体文件: 參考源代码是ffmpeg 自带的apiexample.c 一.源代码#include <stdlib.h>#include ...
- Laravel 学习笔记之数据库操作——Eloquent ORM
1. 时间戳 默认情况下在使用ORM操作数据库进行添加.修改数据时, created_at 和 updated_at列会自动存在于数据表中,并显示的是 ‘2017’格式,如果想以 Unix时间戳格式存 ...
- vue手动制作地址选择器
方法一:4级地址选择器(基于elementui Cascader 级联选择器) 推荐 效果图: 组件源码: <template> <div class="select- ...
- iOS之Run Loop详解
转自标哥的技术博客(www.henishuo.com) 前言 做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一 ...