답안 #868857

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
868857 2023-11-02T09:02:34 Z abcvuitunggio 열쇠 (IOI21_keys) C++17
0 / 100
5 ms 19052 KB
#include <bits/stdc++.h>
using namespace std;
vector <int> ans,col[300001],ve;
vector <pair <int, int>> ke[300001];
int n,m,p[300001],d[300001],r[300001],isleaf[300001],sum;
int f(int i){
    return (p[i]==i?i:p[i]=f(p[i]));
}
void unite(int i, int j){
    p[f(j)]=f(i);
}
int bfs(int s){
    queue <int> q;
    q.push(s);
    d[s]=1;
    int res=-1;
    ve.clear();
    while (!q.empty()){
        int u=q.front();
        q.pop();
        if (f(u)!=f(s)){
            res=u;
            break;
        }
        ve.push_back(u);
        for (auto [v,c]:ke[u])
            if (!d[v])
                col[c].push_back(v);
        for (int v:col[r[u]])
            if (!d[v]){
                d[v]=1;
                q.push(v);
            }
        col[r[u]].clear();
    }
    for (int i:ve){
        d[i]=0;
        for (auto [v,c]:ke[i])
            col[c].clear();
    }
    d[res]=0;
    sum+=ve.size();
    return res;
}
vector <int> find_reachable(vector <int> R, vector <int> u, vector <int> v, vector <int> c){
    n=R.size();
    m=u.size();
    for (int i=0;i<n;i++){
        r[i]=R[i];
        p[i]=i;
        ans.push_back(0);
    }
    for (int i=0;i<m;i++){
        ke[u[i]].push_back({v[i],c[i]});
        ke[v[i]].push_back({u[i],c[i]});
    }
    bool ch=true;
    vector <pair <int, int>> tmp;
    while (ch){
        ch=false;
        tmp.clear();
        for (int i=0;i<n;i++)
            if (f(i)==i&&!isleaf[i]){
                int j=bfs(i);
                if (j==-1)
                    isleaf[i]=1;
                else{
                    tmp.push_back({j,i});
                    ch=true;
                }
            }
        for (auto [u,v]:tmp)
            unite(u,v);
    }
    int mn=1e9;
    for (int i=0;i<n;i++){
        if (i==f(i)){
            bfs(i);
            mn=min(mn,(int)ve.size());
        }
    }
    for (int i=0;i<n;i++)
        if (i==f(i)){
            bfs(i);
            if (ve.size()==mn)
                for (int j:ve)
                    ans[j]=1;
        }
	return ans;
}

Compilation message

keys.cpp: In function 'std::vector<int> find_reachable(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
keys.cpp:85:26: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   85 |             if (ve.size()==mn)
      |                 ~~~~~~~~~^~~~
keys.cpp:82:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   82 |     for (int i=0;i<n;i++)
      |     ^~~
keys.cpp:89:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   89 |  return ans;
      |  ^~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 19036 KB Output is correct
2 Correct 4 ms 19036 KB Output is correct
3 Correct 4 ms 19052 KB Output is correct
4 Incorrect 4 ms 19036 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 19036 KB Output is correct
2 Correct 4 ms 19036 KB Output is correct
3 Correct 4 ms 19052 KB Output is correct
4 Incorrect 4 ms 19036 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 19036 KB Output is correct
2 Correct 4 ms 19036 KB Output is correct
3 Correct 4 ms 19052 KB Output is correct
4 Incorrect 4 ms 19036 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 19036 KB Output is correct
2 Correct 4 ms 19036 KB Output is correct
3 Correct 4 ms 19052 KB Output is correct
4 Incorrect 4 ms 19036 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 19036 KB Output is correct
2 Correct 4 ms 19036 KB Output is correct
3 Correct 4 ms 19052 KB Output is correct
4 Incorrect 4 ms 19036 KB Output isn't correct
5 Halted 0 ms 0 KB -