結果
| 問題 |
No.2403 "Eight" Bridges of Königsberg
|
| コンテスト | |
| ユーザー |
憩いの場
|
| 提出日時 | 2023-08-09 22:33:53 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,611 bytes |
| コンパイル時間 | 996 ms |
| コンパイル使用メモリ | 78,804 KB |
| 実行使用メモリ | 6,824 KB |
| 最終ジャッジ日時 | 2024-11-15 20:43:44 |
| 合計ジャッジ時間 | 3,109 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 25 WA * 6 |
ソースコード
#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 && count == 1 )
{
cout << 0 << endl;
}
else
{
cout << max( num / 2 - 1 * count, 0 ) + count - 1 << endl;
}
return 0;
}
憩いの場