#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct Item
{
unsigned int vert;
unsigned int degree;
Item(unsigned int v, unsigned int d):
vert(v), degree(d) {};
};
struct Comp
{
bool operator()(const Item& first, const Item& second)
{
return first.degree > second.degree;
}
};
struct Data
{
unsigned int actualSize;
bool valid;
unsigned int group;
Data(unsigned int a): actualSize(a), valid(true), group(0) {};
};
void dfs(unsigned int root,
vector< vector <int> >& vertex,
vector<Data>& data,
unsigned int group)
{
data[root].group = group;
for(unsigned int i=0; i<vertex[root].size(); ++i)
{
unsigned int neigh = vertex[root][i];
if(data[neigh].valid and data[neigh].group==0)
{
dfs(neigh, vertex, data, group);
}
}
}
int main()
{
unsigned int vertices;
unsigned int edges;
unsigned int minDegree;
cin >> vertices;
cin >> edges;
cin >> minDegree;
vector< vector <int> > vertex(vertices+1, vector<int>());
vector< Data > data(vertices+1, Data(0));
unsigned int first, second;
for(unsigned int i=0; i<edges; ++i)
{
cin >> first;
cin >> second;
vertex[first].push_back(second);
vertex[second].push_back(first);
}
priority_queue<Item, vector<Item>, Comp> que;
for(unsigned int i=1; i<=vertices; ++i)
{
que.push(Item(i, vertex[i].size()));
data[i].actualSize = vertex[i].size();
}
while(que.top().degree < minDegree)
{
Item toRemove = que.top();
que.pop();
if(data[toRemove.vert].valid)
{
for(unsigned int i=0; i<vertex[toRemove.vert].size(); ++i)
{
unsigned int neigh = vertex[toRemove.vert][i];
if(data[neigh].valid)
{
data[neigh].actualSize--;
que.push(Item(neigh, data[neigh].actualSize));
}
}
data[toRemove.vert].valid = false;
}
}
unsigned int group = 1;
for(unsigned int i=1; i<=vertices; ++i)
{
if(data[i].valid and data[i].group==0)
{
dfs(i, vertex, data, group);
++group;
}
}
vector<unsigned int> groups(group, 0);
for(unsigned int i=1; i<=vertices; ++i)
{
if(data[i].valid)
++groups[data[i].group];
}
unsigned int maxGroup = 0;
unsigned int count = 0;
for(unsigned int i=1; i<group; ++i)
{
if(groups[i]>count)
{
count = groups[i];
maxGroup = i;
}
}
if(count==0)
cout << "NIE";
else
{
cout << count << endl;
for(unsigned int i=1; i<=vertices; ++i)
{
if(data[i].group==maxGroup)
cout << i << " ";
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <iostream> #include <queue> #include <vector> using namespace std; struct Item { unsigned int vert; unsigned int degree; Item(unsigned int v, unsigned int d): vert(v), degree(d) {}; }; struct Comp { bool operator()(const Item& first, const Item& second) { return first.degree > second.degree; } }; struct Data { unsigned int actualSize; bool valid; unsigned int group; Data(unsigned int a): actualSize(a), valid(true), group(0) {}; }; void dfs(unsigned int root, vector< vector <int> >& vertex, vector<Data>& data, unsigned int group) { data[root].group = group; for(unsigned int i=0; i<vertex[root].size(); ++i) { unsigned int neigh = vertex[root][i]; if(data[neigh].valid and data[neigh].group==0) { dfs(neigh, vertex, data, group); } } } int main() { unsigned int vertices; unsigned int edges; unsigned int minDegree; cin >> vertices; cin >> edges; cin >> minDegree; vector< vector <int> > vertex(vertices+1, vector<int>()); vector< Data > data(vertices+1, Data(0)); unsigned int first, second; for(unsigned int i=0; i<edges; ++i) { cin >> first; cin >> second; vertex[first].push_back(second); vertex[second].push_back(first); } priority_queue<Item, vector<Item>, Comp> que; for(unsigned int i=1; i<=vertices; ++i) { que.push(Item(i, vertex[i].size())); data[i].actualSize = vertex[i].size(); } while(que.top().degree < minDegree) { Item toRemove = que.top(); que.pop(); if(data[toRemove.vert].valid) { for(unsigned int i=0; i<vertex[toRemove.vert].size(); ++i) { unsigned int neigh = vertex[toRemove.vert][i]; if(data[neigh].valid) { data[neigh].actualSize--; que.push(Item(neigh, data[neigh].actualSize)); } } data[toRemove.vert].valid = false; } } unsigned int group = 1; for(unsigned int i=1; i<=vertices; ++i) { if(data[i].valid and data[i].group==0) { dfs(i, vertex, data, group); ++group; } } vector<unsigned int> groups(group, 0); for(unsigned int i=1; i<=vertices; ++i) { if(data[i].valid) ++groups[data[i].group]; } unsigned int maxGroup = 0; unsigned int count = 0; for(unsigned int i=1; i<group; ++i) { if(groups[i]>count) { count = groups[i]; maxGroup = i; } } if(count==0) cout << "NIE"; else { cout << count << endl; for(unsigned int i=1; i<=vertices; ++i) { if(data[i].group==maxGroup) cout << i << " "; } } } |
English