Pagini recente » Cod sursa (job #2651940) | Cod sursa (job #2291293) | Cod sursa (job #3200958) | Cod sursa (job #70464) | Cod sursa (job #1048489)
//Elfus <3 tractoare
//To be continued..
#include <stdio.h>
#include <vector>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
vector <int> ini[32100], GTini[32100], G[32100];
bool vis[32100];
int N, M, cnt, st[32100];
int iniToG[32100];
void dfs(int nod) {
vis[nod] = 1;
vector <int> :: iterator it;
for (it = GTini[nod].begin(); it != GTini[nod].end(); ++it)
if (!vis[*it])
dfs(*it);
st[++st[0]] = nod;
}
void dfs2(int nod) {
vis[nod] = 1;
iniToG[nod] = cnt;
vector <int> :: iterator it;
for (it = ini[nod].begin(); it != ini[nod].end(); ++it)
if (!vis[*it])
dfs2(*it);
else
if (iniToG[nod] != iniToG[*it])
G[iniToG[nod]].push_back(iniToG[*it]);
}
void buildDAG() {
for (int i = 1; i <= N; ++i)
if (!vis[i])
dfs(i);
memset(vis, 0, sizeof(vis));
for (int i = st[0]; i >= 1; --i)
if (!vis[st[i]]) {
++cnt;
dfs2(st[i]);
}
N = cnt;
for (int i = 1; i <= N; ++i) {
vector <int> :: iterator it;
it = unique(G[i].begin(), G[i].end());
G[i].resize(distance(G[i].begin(), it));
}
}
int root, deg[32100];
void findRoot() {
for (int i = 1; i <= N; ++i) {
vector <int> :: iterator it;
for (it = G[i].begin(); it != G[i].end(); ++it)
++deg[*it];
}
for (int i = 1; i <= N; ++i)
if (deg[i] == 0)
root = i;
}
vector <int> treeEdge[31000], backEdge[31000];
int E[2 * 31000], Lev[2 * 31000], First[31000];
void dfs3(int nod, int level) {
E[++E[0]] = nod;
Lev[E[0]] = level;
First[nod] = E[0];
vector <int> :: iterator it;
for (it = G[nod].begin(); it != G[nod].end(); ++it)
if (!First[*it]) {
dfs3(*it, level + 1);
treeEdge[nod].push_back(*it);
E[++E[0]] = nod;
Lev[E[0]] = level;
} else
backEdge[nod].push_back(*it);
}
int main() {
freopen("obiective.in", "r", stdin);
freopen("obiective.out", "w", stdout);
scanf("%d%d", &N, &M);
for (int i = 1; i <= M; ++i) {
int xx, yy;
scanf("%d%d", &xx, &yy);
ini[xx].push_back(yy);
GTini[yy].push_back(xx);
}
buildDAG();
findRoot();
dfs3(root, 1);
return 0;
}