int main(void) { scanf("%u %u", &verts, &edges); for(unsigned int e = 0; e < edges; ++ e) { scanf("%u %u", &edge[e].first, &edge[e].second); -- edge[e].first; -- edge[e].second; niceness[e] = 0; } findSCC(); for(unsigned int e = 0, f = component[edge[0].first], t = component[edge[0].second]; e < edges; f = component[edge[++ e].first], t = component[edge[e].second]) { if(f == t) continue; niceness[e] = componentSize[f] + componentSize[t]; if(niceness[e] > niceness[best]) { best = e; count = 0; } else if(niceness[e] == niceness[best]) ++ count; } printf("%u\n%u\n", niceness[best], count); for(unsigned int e = 0; e < edges; ++ e) if(niceness[e] == niceness[best]) printf("%u\n", e + 1); return 0; }
void findSCC(int u) { dfs_low[u] = dfs_num[u] = dfsNumberCounter++; // initalize S.push_back(u); visited[u] = 1; for (int j = 0; j < AdjList[u].size(); j++) { ii v = AdjList[u][j]; if (dfs_num[v.first] == UNVISITED) // not visited by DFS findSCC(v.first); if (visited[v.first]) // belongs to current SCC dfs_low[u] = min(dfs_low[u], dfs_low[v.first]); } if (dfs_low[u] == dfs_num[u]) { // root of SCC reached cout << "SCC " << ++numSCC; while(true) { // print vertices in SCC int v = S.back(); S.pop_back(); visited[v] = 0; cout << " " <<v; if (u == v) break; } cout << endl; } }