結果
| 問題 |
No.2403 "Eight" Bridges of Königsberg
|
| コンテスト | |
| ユーザー |
蜜蜂
|
| 提出日時 | 2023-08-05 12:23:36 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,590 bytes |
| コンパイル時間 | 4,116 ms |
| コンパイル使用メモリ | 235,168 KB |
| 実行使用メモリ | 26,508 KB |
| 最終ジャッジ日時 | 2024-10-15 09:28:21 |
| 合計ジャッジ時間 | 8,218 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 4 |
| other | WA * 31 |
ソースコード
// g++ 1.cpp -std=c++17 -O2 -I .
#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
using ll = long long;
using ld = long double;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vld = vector<ld>;
using vvld = vector<vld>;
using vst = vector<string>;
using vvst = vector<vst>;
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define pq_big(T) priority_queue<T,vector<T>,less<T>>
#define pq_small(T) priority_queue<T,vector<T>,greater<T>>
#define all(a) a.begin(),a.end()
#define rep(i,start,end) for(ll i=start;i<(ll)(end);i++)
#define per(i,start,end) for(ll i=start;i>=(ll)(end);i--)
#define uniq(a) sort(all(a));a.erase(unique(all(a)),a.end())
#include <vector>
#include <cassert>
struct union_find_group{
private:
int n;
std::vector<int> parent_size;
// 正 親
// 負 -1*サイズ
std::vector<std::vector<int>> group_info;
// group の集合情報を常に管理
public:
union_find_group(int sz){
n=sz;
parent_size.resize(n,-1);
group_info.resize(n);
for(int i=0;i<n;i++){
group_info[i].emplace_back(i);
}
}
int root(int i){
assert(0<=i&&i<n);
if(parent_size[i]<0)return i;
return parent_size[i]=root(parent_size[i]);
}
int size(int i){
return -1*parent_size[root(i)];
}
bool same(int i,int j){
assert(0<=i&&i<n&&0<=j&&j<n);
return root(i)==root(j);
}
int merge(int i,int j){
int ri=root(i),rj=root(j);
if(ri==rj)return ri;
// |riの部分集合|>=|rj|の部分集合としたい
if(parent_size[ri]>parent_size[rj]){
std::swap(ri,rj);
}
parent_size[ri]+=parent_size[rj];
parent_size[rj]=ri;
for(int vartex_rj:group_info[rj]){
group_info[ri].emplace_back(vartex_rj);
}
return ri;
}
std::vector<int> group(int i){
int ri=root(i);
return group_info[ri];
}
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m;cin>>n>>m;
union_find_group uf(n);
vi in(n,0);
vi out(n,0);
rep(i,0,m){
int u,v;cin>>u>>v;
u--;v--;
in[v]++;
out[u]++;
uf.merge(u,v);
}
vvi v;
rep(i,0,n){
if(uf.root(i)==i){
v.emplace_back(uf.group(i));
}
}
ll ans=v.size()-1;
for(vi g:v){
vi d;
for(int id:g){
d.emplace_back(in[id]-out[id]);
cout<<id<<" "<<in[id]-out[id]<<endl;
}
int d2=0;
for(int dd:d){
d2+=abs(dd);
}
if(d2>2)ans+=d2/2-1;
if(g.size()==1&&d2==0)ans--;
}
cout<<ans<<endl;
}
蜜蜂