zoukankan      html  css  js  c++  java
  • bzoj2935

    欧拉回路

    我们发现本质上就是加最少的边使得整个图可以分解成若干欧拉回路

    那么我们对于每个联通快单独求解

    如果已经是欧拉回路单独计算

    其他的按照欧拉回路计算公式补全边数即可

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1005;
    int fa[maxn], d[maxn], vis[maxn], sum[maxn];
    int find(int x) {
        return x == fa[x] ? x : fa[x] = find(fa[x]);
    }
    int n, ans, a;
    int main() {
        scanf("%d", &n);
        for(int i = 1; i < maxn; ++i) fa[i] = i;
        for(int i = 1; i <= n; ++i) {
            int x, y; scanf("%d%d", &x, &y);
            ++d[x];
            --d[y];
            vis[x] = vis[y] = 1;
            fa[find(x)] = find(y); 
        }
        for(int i = 1; i < maxn; ++i) 
            if(vis[i]) 
                sum[find(i)] += abs(d[i]);
        for(int i = 1; i < maxn; ++i) if(vis[i] && find(i) == i) {
            if(sum[i] == 0) ++a;
            else ans += sum[i];
        }
        printf("%d
    ", ans / 2 + n + a);
        return 0;
    }
    View Code
  • 相关阅读:
    51nod1278 相离的圆
    CodeForces
    SPOJ
    51nod 1040(欧拉函数)
    51nod1009 51nod1042(数位dp)
    51nod1264 线段相交
    51nod1050 循环数组最大子段和
    Spark SQL UDF示例
    Spark SQL官网阅读笔记
    Spark RDD
  • 原文地址:https://www.cnblogs.com/19992147orz/p/11488710.html
Copyright © 2011-2022 走看看