結果

問題 No.2403 "Eight" Bridges of Königsberg
ユーザー 憩いの場
提出日時 2023-08-09 22:45:54
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 96 ms / 2,000 ms
コード長 1,664 bytes
コンパイル時間 798 ms
コンパイル使用メモリ 89,752 KB
実行使用メモリ 13,696 KB
最終ジャッジ日時 2024-11-26 18:13:02
合計ジャッジ時間 2,938 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 31
権限があれば一括ダウンロードができます

ソースコード

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