Pagini recente » Cod sursa (job #317335) | Cod sursa (job #276702) | Cod sursa (job #2118771) | Cod sursa (job #264654) | Cod sursa (job #2602873)
#include <bits/stdc++.h>
typedef std::pair<int, int> i_pair;
constexpr int BUFFER_SIZE = 1 << 17;
char buffer[BUFFER_SIZE];
int pos = BUFFER_SIZE;
std::vector<int> biconnected_comp;
inline char next() {
if (pos == BUFFER_SIZE) {
fread(buffer, 1, BUFFER_SIZE, stdin);
pos = 0;
}
return buffer[pos++];
}
inline int read() {
int n = 0;
char c = next();
while (!('0' <= c && c <= '9')) {
c = next();
}
while ('0' <= c && c <= '9') {
n = (n << 3) + (n << 1) + (c - '0');
c = next();
}
return n;
}
inline void print(int n) {
char snum[65];
int i = 0;
do {
snum[i++] = n % 10 + '0';
n /= 10;
} while (n);
--i;
while (i >= 0) {
putchar(snum[i--]);
}
putchar(' ');
}
void dfs(std::vector<std::vector<int>> &sol, std::vector<int> *adj, std::vector<int> &disc, std::vector<int> &low,
std::stack<i_pair> &stack, int src, int dad, int time) {
disc[src] = low[src] = ++time;
for (auto &it : adj[src]) {
if (it != dad) {
if (disc[it] == -1) {
stack.push(std::make_pair(src, it));
dfs(sol, adj, disc, low, stack, it, src, time);
low[src] = std::min(low[src], low[it]);
if (low[it] >= disc[src]) {
int node;
biconnected_comp.clear();
do {
biconnected_comp.emplace_back(node = stack.top().second);
stack.pop();
} while(it != node);
biconnected_comp.emplace_back(src);
sol.emplace_back(biconnected_comp);
}
} else {
low[src] = std::min(low[src], disc[it]);
}
}
}
}
int main() {
freopen("biconex.in", "r", stdin);
freopen("biconex.out", "w", stdout);
int n = read(), m = read();
static int time = 0;
std::vector<int> *adj;
adj = new std::vector<int> [n + 1];
int x, y;
std::vector<int> disc(n + 1, -1);
std::vector<int> low(n + 1, 0);
std::stack<i_pair> stack;
std::vector<std::vector<int>> sol;
for (; m; --m) {
x = read(), y = read();
adj[x].emplace_back(y);
adj[y].emplace_back(x);
}
for (int i = 1 ; i <= n ; ++i) {
if (disc[i] == -1) {
dfs(sol, adj, disc, low, stack, i, 0, time);
}
}
print(sol.size());
putchar('\n');
for (auto &it : sol) {
for (int nod : it) {
print(nod);
}
putchar('\n');
}
delete [] adj;
return 0;
}