zoukankan      html  css  js  c++  java
  • CF209C Trails and Glades(欧拉路)

    题意

    最少添加多少条边,使无向图有欧拉回路。

    n,m≤106

    题解

    求出每个点的度数
    奇度数点需要连一条新边
    仅有偶度数点的连通块需要连两条新边
    答案为上面统计的新边数 / 2
    注意:此题默认以1为起点,有重边自环。
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cmath>
     5 #include<string>
     6 using namespace std;
     7 const int N=2000000;
     8 int n,m,fa[N],vis[N],deg[N],flag[N],num,anss,ans;
     9 int find(int x){
    10     if(fa[x]==x)return x;
    11     else return fa[x]=find(fa[x]);
    12 }
    13 void merge(int x,int y){
    14     int a=find(x);
    15     int b=find(y);
    16     if(a==b)return;
    17     fa[a]=b;
    18 }
    19 int main(){
    20     scanf("%d%d",&n,&m);
    21     for(int i=1;i<=n;i++)fa[i]=i;
    22     vis[1]=1;
    23     for(int i=1,a,b;i<=m;i++){
    24         scanf("%d%d",&a,&b);
    25         if(a!=b){
    26             deg[a]++;deg[b]++;
    27             vis[a]=vis[b]=1;
    28             merge(a,b);
    29         }
    30         else vis[a]=1;
    31     }
    32     for(int i=1;i<=n;i++){
    33         if(deg[i]&1){
    34             flag[find(i)]++;
    35         }
    36     }
    37     for(int i=1;i<=n;i++)
    38         if(vis[i]&&i==find(i)){
    39             if(flag[i])ans+=flag[i];
    40             else anss++;
    41             num++;
    42         }
    43     ans/=2;
    44     if(num==1)printf("%d",ans);
    45     else printf("%d",ans+anss);
    46     return 0;
    47 }
    View Code
  • 相关阅读:
    Linux统计文件个数
    python string与list互转
    Python中请使用isinstance()判断变量类型
    xpath提取多个标签下的text
    内存盘
    Watchdog
    渗透测试
    GMT与UTC简介
    ASN.1(抽象语法标记)
    Linux nmap
  • 原文地址:https://www.cnblogs.com/Xu-daxia/p/9385726.html
Copyright © 2011-2022 走看看