Exemple #1
0
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;
}
Exemple #2
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;
	}
}