[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 描述 多米诺骨牌,一种用小的方的木块或其他材料,每个都被一些点在面上标记,这些木块通常被称为骨牌.每个骨牌的面都被一条线分成两个 方形,两边 ...
随机推荐
- linux 文件属性文件权限
权限 -rw-------. root root Mar : anaconda-ks.cfg drwxr-xr-x root root May : dir1 drwxr-xr-x root root ...
- SpringBoot项目启动时执行初始化操作
SpringBooot中的CommandLineRunner接口会在所有Spring Beans初始化之后,SpringApplication.run()之前执行. 1.添加pom引用 <?xm ...
- HttpURLConnection 发送http请求帮助类
java 利用HttpURLConnection 发送http请求 提供GET / POST /上传文件/下载文件 功能 import java.io.*; import java.net.*; im ...
- C++ vector、list和deque的区别 (整理)
1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变.因此能高效的进行随机存取,时间复杂度为o(1);但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内 ...
- [Git] 015 远程仓库篇 第二话
0. 前言 在 [Git] 006 在本地新建一个仓库 中,我在本地建了一个仓库 "git_note" 这回的任务 在 GitHub 上建一个远程仓库:为方便记忆,我就起名为 &q ...
- 17: VUE数据绑定 与 Object.defineProperty
VUE数据绑定原理:https://segmentfault.com/a/1190000006599500?utm_source=tag-newest Object.defineProperty(): ...
- linux(centeros)svn的安装
SVN linux搭建svn服务器参考:http://www.cnblogs.com/chaichuan/p/3758173.htmlSubversion(SVN) 是一个开源的版本控制系統, 也就是 ...
- 第一次整合ssm环境后,对请求流程的理解 ,以及一些配置(有错就更新)
工程结构图: 显示层(handler/controller): request请求到springmvc的前端控制器,从处理器映射器找相应的handler(用@RequestMapping(" ...
- 007-流程控制 if 语句
流程控制 if 语句 if [ 条件判断式 ] ; then 程序 fi if [ 条件判断式 ] then 程序 fi 脚本示例: [root@zabbix lianxi]# .sh #!/bin/ ...
- PAT Advanced 1058 A+B in Hogwarts (20 分)
If you are a fan of Harry Potter, you would know the world of magic has its own currency system -- a ...