結果

問題 No.2403 "Eight" Bridges of Königsberg
ユーザー 憩いの場憩いの場
提出日時 2023-08-09 22:45:54
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 93 ms / 2,000 ms
コード長 1,664 bytes
コンパイル時間 843 ms
コンパイル使用メモリ 89,892 KB
実行使用メモリ 13,952 KB
最終ジャッジ日時 2024-05-05 01:49:27
合計ジャッジ時間 3,039 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 1 ms
5,376 KB
testcase_04 AC 40 ms
5,376 KB
testcase_05 AC 81 ms
5,376 KB
testcase_06 AC 89 ms
5,376 KB
testcase_07 AC 51 ms
5,376 KB
testcase_08 AC 62 ms
5,376 KB
testcase_09 AC 93 ms
5,376 KB
testcase_10 AC 88 ms
5,376 KB
testcase_11 AC 68 ms
5,376 KB
testcase_12 AC 91 ms
5,376 KB
testcase_13 AC 62 ms
5,376 KB
testcase_14 AC 2 ms
5,376 KB
testcase_15 AC 2 ms
5,376 KB
testcase_16 AC 2 ms
5,376 KB
testcase_17 AC 2 ms
5,376 KB
testcase_18 AC 2 ms
5,376 KB
testcase_19 AC 40 ms
13,952 KB
testcase_20 AC 7 ms
5,632 KB
testcase_21 AC 19 ms
8,704 KB
testcase_22 AC 37 ms
12,544 KB
testcase_23 AC 35 ms
12,288 KB
testcase_24 AC 23 ms
10,752 KB
testcase_25 AC 25 ms
10,112 KB
testcase_26 AC 2 ms
5,376 KB
testcase_27 AC 38 ms
13,184 KB
testcase_28 AC 28 ms
11,008 KB
testcase_29 AC 10 ms
5,376 KB
testcase_30 AC 14 ms
7,552 KB
testcase_31 AC 34 ms
13,440 KB
testcase_32 AC 3 ms
5,376 KB
testcase_33 AC 10 ms
6,272 KB
testcase_34 AC 7 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

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

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]++;
    }

    map<int, int> mp;
    int num = 0, count = 0;
    for( int i = 1; i <= N; i++ )
    {
        if( in[i] > out[i] )
        {
            mp[U.find( i )] += in[i] - out[i];
        }
    }

    set<int> already;
    for( int i = 1; i <= N; i++ )
    {
        num += max( mp[i] - 1, 0 );
        if( !already.count( U.find( i ) ) && in[i] != 0 )
        {
            already.insert( U.find( i ) );
            count++;
        }
    }

    cout << num + count - 1 << endl;

    return 0;
}
0