All pastes #2108954 Raw Edit

Miscellany

public text v1 · immutable
#2108954 ·published 2012-02-02 08:42 UTC
rendered paste body
#include <iostream>
#include <iomanip>
#include <vector>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>

using namespace std;

int n, current_color;
vector < vector <int> > g, gr;
vector <bool> used;
vector <int> order, color;

void dfs1 (int v)
{
	used[v] = true;

	for (int i = 0; i < g[v].size(); i++)
		if (!used[g[v][i]])
			dfs1(g[v][i]);

	order.push_back(v);
}

void dfs2 (int v)
{
	color[v] = current_color;

	for (int i = 0; i < gr[v].size(); i++)
		if (!color[gr[v][i]])
			dfs2(gr[v][i]);
}

int main()
{
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);

	int i, j, m, u, v;

	scanf("%d %d\n", &n, &m);

	g.resize(n);
	gr.resize(n);
	for (i = 0; i < n; i++)
	{
		scanf("%d %d\n", &u, &v);

		--u, --v;

		g[u].push_back(v);
		gr[v].push_back(u);
	}

	used.assign(n, false);

	for (i = 0; i < n; i++)
		if (!used[i])
			dfs1(i);

	color.assign(n, 0);
	used.assign(n, false);

	current_color = 1;

	for (i = 0; i < n; i++)
	{
		v = order[n - 1 - i];

		if (!color[v])
		{
			dfs2(v);
			current_color++;
		}
	}

	m = 0;

	for (i = 0; i < n; i++)
	{
		sort(g[i].begin(), g[i].end());
		for (j = 0; j < g[i].size(); j++)
			if (color[i] != color[g[i][j]])
			{
				m++;
				while (j < g[i].size() - 1 && g[i][j] == g[i][j+1])
					j++;
			}
	}

	printf("%d\n", m);

	return 0;
}