zoukankan      html  css  js  c++  java
  • CF209C Trails and Glades 无向图欧拉回路

    题意:

    戳这里

    分析:

    • 前置芝士:无向图欧拉回路

    打眼一看,以为是一道水题

    直接求出奇度数的点然后连边就行了

    没想到,傻子还是我自己

    给出的图并不保证联通,还要求必须从 (1) 出发走一条欧拉回路,所以我们为了保证联通,按连通块为单位进行考虑,连通块只有 (3) 种情况,仅有 奇度数点 , 仅有偶度数点,两者都有,我们分开考虑

    1. 对于有奇度数点的连通块,本身奇度数点就要向外连边,所以连通块一定会与别的连通块相连,
    2. 对于仅有偶度数的点,本身可以形成欧拉回路,但是要和外界联通,那么必须向外连边,由于还要保证自身维持偶度数,所以需要向外连 (2) 条边

    那么答案就是( 奇度数的点的个数+仅含偶度数的点的连通块个数 * 2 )/ 2

    因为一条边可以同时满足两个点的需求

    tip: 还要特判一种情况就是,仅含一个连通块,且连通块没有奇度数的点,此时不需要加任何边

    代码:

    #include<bits/stdc++.h>
    #define pii pair<int,int>
    #define mk(x,y) make_pair(x,y)
    #define lc rt<<1
    #define rc rt<<1|1
    #define pb push_back
    #define fir first
    #define sec second
    #define inl inline
    #define reg register
    
    using namespace std;
    
    namespace zzc
    {
    	inline int read()
    	{
    		int x=0,f=1;char ch=getchar();
    		while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    		while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    		return x*f;
    	}
    	
    	const int maxn = 1e6+5;
    	int n,m,cnt,ans;
    	int deg[maxn];
    	bool con[maxn],odd,flag,vis[maxn];
    	vector<int> e[maxn];
    	
    	void dfs(int u)
    	{
    		vis[u]=true;
    		if(deg[u]&1) flag=true;
    		for(auto v:e[u]) if(!vis[v]) dfs(v);
    	}
    	
    	void work()
    	{
    		int a,b;
    		n=read();m=read();
    		for(int i=1;i<=m;i++)
    		{
    			a=read();b=read();
    			con[a]=con[b]=true;
    			e[a].pb(b);e[b].pb(a);
    			deg[a]++;deg[b]++;
    		}
    		con[1]=1;
    		for(int i=1;i<=n;i++)
    		{
    			if(deg[i]&1)
    			{
    				ans++;
    				odd=true;
    			}
    			else if(!vis[i]&&con[i])
    			{
    				cnt++;
    				flag=false;
    				dfs(i);
    				if(!flag) ans+=2;
    			}
    		}
    		if(odd==false&&cnt==1) ans=0;
    		printf("%d
    ",ans/2);
    	}
    
    }
    
    int main()
    {
    	zzc::work();
    	return 0;
    }
    
    
  • 相关阅读:
    数据结构(二)(三)栈和队列
    数据结构(一)线性表
    中信卡笔试代码
    Jenkins搭建-简单使用
    python 生成指定两个ip间的所有ip
    形象理解 什么是磁盘碎片
    形象理解软件位宽 32位和64位的区别
    看板娘>_
    Win10一张网卡设置多个ip地址
    VMware ubuntu安装tools灰色?
  • 原文地址:https://www.cnblogs.com/youth518/p/14284956.html
Copyright © 2011-2022 走看看