제출 #1237371

#제출 시각아이디문제언어결과실행 시간메모리
1237371jer033Split the Attractions (IOI19_split)C++20
컴파일 에러
0 ms0 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;

int centroid_find(int n, vector<vector<int>> (&edges))
{
    //create a spanning tree
    //vector<vector<int>> new_edges(n);
    vector<int> parent(n, -2);
    vector<int> nodes;

    nodes.push_back(0);
    parent[0] = -1;
    
    int curr = 0;
    int total = 1;

    while (curr < total)
    {
        int x = nodes[curr]; curr++;
        for (int y: edges[x])
        {
            if (parent[y] == -2)
            {
                parent[y] = x;
                nodes.push_back(y);
                total++;
                //new_edges[]
            }
        }
    }

    vector<int> subtreesize(n, 1);
    for (int i=n-1; i>0; i--)
    {
        int x = nodes[i];
        subtreesize[parent[x]] += subtreesize[x];
    }

    //now identify the centroid
    int bes = n+1;
    int cap = (n+1)/2;
    int centroid = -1;
    for (int i=0; i<n; i++)
        if ((subtreesize[i]<bes) and (subtreesize[i]>=cap))
        {
            bes = subtreesize[i];
            centroid = i;
        }
    return centroid;
}

vector<int> find_split_wlog(int n, int a, int b, int c, vector<int> p, vector<int> q) {
	vector<vector<int>> edges(n);
    int e = p.size();
    for (int i=0; i<e; i++)
    {
        int pp = p[i];
        int qq = q[i];
        edges[pp].push_back(qq);
        edges[qq].push_back(pp);
    }

    int root = centroid_find(n, edges);
    //cout << root << '\n';

    //step 3: perform a dfs and identify whether its possible or not

    vector<int> parent(n, -2);
    stack<pair<int, int>> nodes;
    vector<int> push_order;
    vector<vector<int>> children(n);

    parent[root] = -1;
    nodes.push({root, 0});
    push_order.push_back(root);

    while (!nodes.empty())
    {
        pair<int, int> info = nodes.top();
        int x = info.first; int y = info.second;
        nodes.pop();
        if ((y+1)<edges[x].size())
            nodes.push({x, y+1});
        int z = edges[x][y];
        if (parent[z]==-2)
        {
            parent[z] = x;
            nodes.push({z, 0});
            push_order.push_back(z);
            children[x].push_back(z);
        }
    }

    vector<int> subtreesize(n, 1);
    for (int i=n-1; i>0; i--)
    {
        int x = push_order[i];
        subtreesize[parent[x]] += subtreesize[x];
        //cout << x << subtreesize[x] << '\n';
    }
    
    int node_min = n+1;
    int root_a = -1;
    for (int i: edges[root])
        if ((i!=root) and (subtreesize[i] < node_min) and (subtreesize[i]>=a))
        {
            node_min = subtreesize[i];
            root_a = i;
        }
    
    if (root_a == -1)
    {
        vector<int> ans(n, 0);
        return ans;
    }

    //then a solution is possible
    vector<int> ans(n, 3);
    queue<int> group_a;
    group_a.push(root_a);
    ans[root_a] = 1;
    int members = 1;
    while (members < a)
    {
        int x = group_a.front(); group_a.pop();
        for (int y: children[x])
            if (members < a)
            {
                ans[y] = 1;
                group_a.push(y);
                members++;
            }
    }

    queue<int> group_b;
    group_b.push(root);
    ans[root] = 2;
    members = 1;
    while (members < b)
    {
        int x = group_b.front(); group_b.pop();
        for (int y: children[x])
            if ((members < b) and (ans[y]==3))
            {
                ans[y] = 2;
                group_b.push(y);
                members++;
            }
    }

    return ans;
}

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
	vector<int> rewrite = {0, 1, 2, 3};
    for (int i=0; i<5; i++)
    {
        if (a>b)
        {
            swap(a, b);
            swap(rewrite[1], rewrite[2]);
        }
        if (b>c)
        {
            swap(b, c);
            swap(rewrite[2], rewrite[3]);
        }
    }

    vector<int> ans = find_split_wlog(n, a, b, c, p, q);
    for (int i=0; i<n; i++)
    {
        ans[i] = rewrite[ans[i]];
    }
    return ans;
}

int main() {
	int n, m, a, b, c; cin >> n >> m >> a >> b >> c;
	vector<int> p(m), q(m);
	for (int i=0; i<m; i++)
		cin >> p[i] >> q[i];

	vector<int> result = find_split(n, a, b, c, p, q);

	for (int i=0; i<(int)result.size(); i++)
		printf("%s%d", ((i>0)?" ":""), result[i]);
	printf("\n");

	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

/usr/bin/ld: /tmp/ccOqkgks.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccdbDtV8.o:split.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status