結果

問題 No.2403 "Eight" Bridges of Königsberg
ユーザー 憩いの場憩いの場
提出日時 2023-08-09 22:25:57
言語 C++14
(gcc 12.3.0 + boost 1.83.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
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,248 KB
testcase_02 AC 2 ms
5,248 KB
testcase_03 AC 2 ms
5,248 KB
testcase_04 AC 44 ms
5,248 KB
testcase_05 AC 87 ms
5,248 KB
testcase_06 AC 95 ms
5,248 KB
testcase_07 AC 56 ms
5,248 KB
testcase_08 AC 66 ms
5,248 KB
testcase_09 AC 102 ms
5,248 KB
testcase_10 AC 95 ms
5,248 KB
testcase_11 AC 73 ms
5,248 KB
testcase_12 AC 102 ms
5,248 KB
testcase_13 AC 68 ms
5,248 KB
testcase_14 AC 2 ms
5,248 KB
testcase_15 WA -
testcase_16 AC 2 ms
5,248 KB
testcase_17 WA -
testcase_18 AC 2 ms
5,248 KB
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 WA -
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 WA -
testcase_27 WA -
testcase_28 WA -
testcase_29 WA -
testcase_30 WA -
testcase_31 WA -
testcase_32 WA -
testcase_33 WA -
testcase_34 WA -
権限があれば一括ダウンロードができます

ソースコード

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