結果

問題 No.2403 "Eight" Bridges of Königsberg
ユーザー 憩いの場
提出日時 2023-08-09 22:25:57
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,579 bytes
コンパイル時間 716 ms
コンパイル使用メモリ 78,560 KB
実行使用メモリ 5,888 KB
最終ジャッジ日時 2024-11-15 20:33:27
合計ジャッジ時間 2,903 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 13 WA * 18
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<iostream>
#include<vector>
#include<set>

using namespace std;

#include <numeric>

class UnionFind
{
private:
    std::vector<int> m_parents;
    std::vector<int> m_sizes;

public:
    UnionFind() = default;

    explicit UnionFind(size_t n)
        : m_parents(n)
        , m_sizes(n, 1)
        {
            std::iota(m_parents.begin(), m_parents.end(), 0);
        }

    int find(int i)
    {
        if (m_parents[i] == i)
        {
            return i;
        }

        return (m_parents[i] = find(m_parents[i]));
    }

    void merge(int a, int b)
    {
        a = find(a);
        b = find(b);

        if (a != b)
        {
            m_sizes[a] += m_sizes[b];
            m_parents[b] = a;
        }
    }

    bool connected(int a, int b)
    {
        return (find(a) == find(b));
    }
    
    int size(int i)
    {
        return m_sizes[find(i)];
    }
};

int main( void )
{
    int N, M;
    cin >> N >> M;
    vector<int> in( N + 1, 0 ), out( N + 1, 0 );
    UnionFind U( N + 1 );
    
    int u, v;
    for( int i = 0; i < M; i++ )
    {
        cin >> u >> v;
        U.merge( u, v );
        in[v]++, out[u]++;
    }

    int num = 0, count = 0;
    set<int> already;
    for( int i = 1; i <= N; i++ )
    {
        num += abs( in[i] - out[i] );

        if( !already.count( U.find( i ) ) && in[i] != 0 )
        {
            already.insert( U.find( i ) );
            count++;
        }
    }

    if( num == 0 )
    {
        cout << 0 << endl;
    }
    else
    {
        cout << num / 2 - 1 + count - 1 << endl;
    }

    return 0;
}
0