星际旅行(思维很好的欧拉路)

把每条边拆成两条。欧拉(回)路,只有0或2两个奇点。因为2条边经过一次,m-2条边经过两次,可以考虑删除两条边,使剩下的图有0或2两个奇点。所以这两条边要么是任意两个自环,要么是有一个公共端点的两条边,要么是一个自环和任意一条边。

我们要判断,整个图联不联通,因为要经过m条边。然而我们判断所有边联通的点联不联通,不是判断所有点联不联通。如下图,所有点不联通,但是能找到航线。

#include<bits/stdc++.h>
using namespace std;
long long fa[1000010], n, m, ru[1000010], zuo[1000010], you[1000010], si;
int find(int x)
{
	if(x == fa[x]) return x;
	return fa[x] = find(fa[x]);
}
void  unio(int x,int y)
{
	int r1 = find(x); int r2 = find(y); fa[r1] = r2;
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(int i = 1; i <= n; i++) fa[i] = i;
	for(int i = 1; i <= m; i++)
	{
	 scanf("%d%d",&zuo[i],&you[i]);
		if(zuo[i]!= you[i]){
		unio(zuo[i],you[i]);ru[you[i]]++;	ru[zuo[i]]++;
		}else si++;
	}
	int ha = find(zuo[1]);
	for(int i = 2; i <= m; i++)
	{
		int he = find(zuo[i]);
		if(ha  != he) {
			printf("0"); return 0;
		}
	}
	long long ans = 0;
	ans = si * (si-1);
	ans += si * (m - si);
	for(int i = 1; i <= n; i++)
	ans += ru[i] * (ru[i] - 1)/2;
	cout << ans;
	return 0;
} 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值