8052 2024. 01. 12 11:31:07 UVince Hálózati biztonság (50) cpp17 Elfogadva 50/50 167ms 31284 KiB
#include <bits/stdc++.h>
using namespace std;
using ll=long long;

struct edge{
    int a;
    int b;
    bool active=true;
};


int n,m,k;
vector<edge> edges;
vector<vector<int>> adj;
vector<int> kifok;
vector<bool> done;
vector<bool> vis;
vector<vector<int>> ans;

int dfs(int node){
    if (vis[node]) return 0;
    vis[node]=true;
    int ret=1;
    ans.back().push_back(node);
    for (int i : adj[node]){
        if (edges[i].active){
            if (edges[i].a!=node) swap(edges[i].a, edges[i].b);
            ret+=dfs(edges[i].b);
        }
    }
    return ret;
}


int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>m>>k;
    adj.resize(n+1);
    edges.resize(m);
    kifok.resize(n+1);
    done.resize(n+1, false);
    vis.resize(n+1,false);
    for (int i = 0; i < m; i++)
    {
        int a,b;
        cin>>a>>b;
        edges[i]={a,b};
        adj[a].push_back(i);
        adj[b].push_back(i);
        kifok[a]++;
        kifok[b]++;
    }
    priority_queue<array<int,2>, vector<array<int,2>>, greater<array<int,2>>> sor;
    for (int i=1;i<=n;i++) sor.push({kifok[i],i});
    while (sor.top()[0]<k){
        auto [ki, node] = sor.top();
        sor.pop();
        if (done[node]) continue;
        done[node]=true;
        for (int i : adj[node]){
            edge& el=edges[i];
            if(!el.active) continue;
            kifok[el.a]--;
            kifok[el.b]--;
            el.active=false;
            if (!done[el.a]) sor.push({kifok[el.a], el.a});
            if (!done[el.b]) sor.push({kifok[el.b], el.b});
        }
    }
    int ma=INT_MIN,maxi=-1;
    for (int i=1;i<=n;i++) {
        if (!done[i] && !vis[i]) {
            ans.push_back({});
            int si=dfs(i);
            ma=max(ma,si);
            maxi=(ma=si) ? ans.size()-1 : maxi;
        }
    }
    if (maxi==-1){
        cout<<"0";
        return 0;
    }
    cout<<ans[maxi].size()<<"\n";
    sort(ans[maxi].begin(), ans[maxi].end());
    for (int i : ans[maxi]) cout<<i<<" ";
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 50/50
1 Elfogadva 0/0 3ms 1864 KiB
2 Elfogadva 0/0 86ms 14368 KiB
3 Elfogadva 2/2 3ms 3404 KiB
4 Elfogadva 2/2 3ms 3632 KiB
5 Elfogadva 2/2 3ms 3856 KiB
6 Elfogadva 2/2 3ms 4060 KiB
7 Elfogadva 2/2 3ms 4156 KiB
8 Elfogadva 2/2 3ms 4520 KiB
9 Elfogadva 2/2 3ms 4748 KiB
10 Elfogadva 2/2 6ms 5408 KiB
11 Elfogadva 2/2 3ms 4984 KiB
12 Elfogadva 2/2 4ms 5644 KiB
13 Elfogadva 3/3 4ms 5620 KiB
14 Elfogadva 3/3 8ms 6824 KiB
15 Elfogadva 3/3 10ms 7828 KiB
16 Elfogadva 3/3 79ms 16152 KiB
17 Elfogadva 3/3 8ms 7768 KiB
18 Elfogadva 3/3 17ms 11780 KiB
19 Elfogadva 3/3 101ms 23584 KiB
20 Elfogadva 3/3 167ms 31284 KiB
21 Elfogadva 3/3 105ms 27492 KiB
22 Elfogadva 3/3 3ms 11484 KiB