zoukankan      html  css  js  c++  java
  • HZOI2019 星际旅行 欧拉路

    题目大意: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
    "); 
    			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
    ",ans);
    	return 0;
    }
    

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

  • 相关阅读:
    nginx 配置优化(简单)
    Nginx 安装
    Smokeping安装教程
    test [ ] 四类
    if语句中的判断条件(nginx)
    力扣 1431. 拥有最多糖果的孩子 python
    力扣 1672. 最富有客户的资产总量+1512. 好数对的数目 python
    力扣 剑指 Offer 58
    力扣 8. 字符串转换整数 (atoi)python--每日一题
    力扣 7. 整数反转python 每日一题
  • 原文地址:https://www.cnblogs.com/Juve/p/11207667.html
Copyright © 2011-2022 走看看