# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
298741 | gabrc52 | Split the Attractions (IOI19_split) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using vi = vector<int>;
using ii = pair<int,int>;
const int MAXN=100000;
int V,E;
ii sizes[3];
vi adj[MAXN];
vi ans;
int vis[MAXN];
int p[MAXN];
bool cycle;
void dfs(int u) {
vis[u] = 1;
for (int v : adj[u]) {
if (!vis[v]) {
p[v] = u;
dfs(v);
} else if (v != p[u] && vis[v]) {
cycle = true;
}
}
}
void resetVis() {
for (int i=0; i<V; i++) {
vis[i] = 0;
}
}
vi find_split(int _V, int a, int b, int c, vi _u, vi _v) {
/// Init global state
int E = _u.size();
V = _V;
for (int i=0; i<E; i++) {
int a = _u[i];
int b = _v[i];
adj[a].push_back(b);
adj[b].push_back(a);
}
sizes[0] = {a,1};
sizes[1] = {b,2};
sizes[2] = {c,3};
sort(sizes, sizes+3);
ans.resize(V);
/// Actual implementation
if (sizes[0].first + sizes[1].first <= V) {
resetVis();
dfs(0);
int u;
if (cycle) {
resetVis();
u = 0;
} else {
for (int i=0; i<V; i++) {
if (adj[i].size() == 1) {
u = i;
break;
}
}
}
resetVis();
for (int s=0; s<2; s++) {
for (int i=0; i<sizes[s].first; i++) {
ans[i] = sizes[s].second;
vis[u] = true;
for (int v : adj[u]) {
if (!vis[u]) {
u = v;
break;
}
}
}
}
}
return ans;
}
int main() {
int n,m,a,b,c;
cin>>n>>m;
cin>>a>>b>>c;
vi u(m);
vi v(m);
for (int i=0; i<m; i++) {
cin>>u[i]>>v[i];
}
vi ans = find_split(n,a,b,c,u,v);
for (int i : ans) {
cout<<i<<' ';
}
cout<<'\n';
}