Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define forr(i, a, b) for(int i = (a); i < (int)(b); i++)
- #define forn(i, n) forr(i, 0, n)
- #define forall(it, v) for(auto it = v.begin(); it != v.end(); ++it)
- #define dforn(i, n) for(int i = n - 1; i >= 0; i--)
- #define db(v) cerr << #v << " = " << v << endl
- #define pb push_back
- typedef long long ll;
- const int MAXN = 20050;
- int tc, n, m, nCC, color[MAXN];
- vector<int> G[MAXN], H[MAXN], topsort, CC[MAXN];
- set<int> ADY[MAXN];
- bool used[MAXN], contado[MAXN];
- void limpiar(){
- forn(i, MAXN){
- G[i].clear();
- H[i].clear();
- CC[i].clear();
- ADY[i].clear();
- }
- nCC = 0;
- topsort.clear();
- memset(contado, false, sizeof contado);
- memset(color, 0, sizeof color);
- memset(used, false, sizeof used);
- }
- void dfs(int v, int p){
- used[v] = true;
- forn(i, G[v].size()){
- int w = G[v][i];
- if(w == p) continue;
- if(used[w]) continue;
- dfs(w, v);
- }
- topsort.push_back(v);
- }
- void dfs_reverse(int v, int p, int c){
- //~ printf("Visitando %d con color %d\n", v + 1, c + 1);
- used[v] = true;
- color[v] = c;
- CC[c].push_back(v);
- forn(i, H[v].size()){
- int w = H[v][i];
- if(w == p) continue;
- if(used[w]) continue;
- dfs_reverse(w, v, c);
- }
- }
- int main() {
- scanf("%d", &tc);
- while(tc--){
- limpiar();
- scanf("%d %d", &n, &m);
- forn(i, m){
- int a, b;
- scanf("%d %d", &a, &b);
- --a; --b;
- G[a].pb(b);
- H[b].pb(a);
- }
- forn(i, n){
- if(!used[i]){
- dfs(i, -1);
- }
- }
- reverse(topsort.begin(), topsort.end());
- memset(used, false, sizeof used);
- forn(i, topsort.size()){
- int v = topsort[i];
- if(!used[v]){
- dfs_reverse(v, -1, nCC++);
- }
- }
- forn(i, nCC){
- printf("CC %d\n", i + 1);
- forn(j, CC[i].size()){
- printf("%d ", CC[i][j] + 1);
- }
- puts("");
- }
- forn(i, nCC){
- forn(j, CC[i].size()){
- int v = CC[i][j];
- forn(k, G[v].size()){
- int to = G[v][k];
- if(to == i) continue;
- ADY[i].insert( color[to] );
- }
- }
- }
- int ans = nCC;
- forn(i, nCC){
- printf("Desde CC %d:\n", i + 1);
- forall(it, ADY[i]){
- int to = *it;
- printf(" --> %d\n", to);
- if(!contado[to]){
- contado[to] = true;
- ans--;
- }
- }
- }
- printf("%d\n", ans);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement