Skip to content

Instantly share code, notes, and snippets.

@potetisensei
Last active August 29, 2015 14:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save potetisensei/3d5ca423658f09b4cac8 to your computer and use it in GitHub Desktop.
Save potetisensei/3d5ca423658f09b4cac8 to your computer and use it in GitHub Desktop.
POJ 3180
#include <cstdio>
#include <cassert>
#include <vector>
using namespace std;
int ans;
int n;
int m;
int t;
bool used[10000];
int order[10000];
int belong[10000];
vector<int> es[10000];
vector<int> reves[10000];
void dfs(int v, int &id) {
used[v] = true;
for (int i=0; i<es[v].size(); i++) {
int u = es[v][i];
if (!used[u]) dfs(u, id);
}
order[id++] = v;
}
int rdfs(int v, int grp) {
int num = 0;
used[v] = true;
belong[v] = grp;
for (int i=0; i<reves[v].size(); i++) {
int u = reves[v][i];
if (!used[u]) num += rdfs(u, grp);
}
return num+1;
}
int main() {
scanf("%d%d", &n, &m);
for (int i=0; i<m; i++) {
int a, b;
scanf("%d%d", &a, &b);
--a;
--b;
es[a].push_back(b);
reves[b].push_back(a);
}
t = 0;
for (int i=0; i<n; i++) {
if (!used[i]) dfs(i, t);
}
fill(used, used+n, false);
assert(t == n);
t = 0;
for (int i=n-1; i>=0; i--) {
int v = order[i];
if (!used[v]) {
if (rdfs(v, t++) > 1) ans++;
}
}
printf("%d\n", ans);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment