Pagini recente » Cod sursa (job #2421867) | Cod sursa (job #1368371) | Cod sursa (job #1605915) | ONIS 2014, Clasament Runda 1 | Cod sursa (job #571117)
Cod sursa(job #571117)
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>
using namespace std;
typedef vector<int> *graf;
vector< vector<int> > solutii;
#define ALB 0
#define NEGRU 1
graf G;
stack<int> S;
int* idx,*lowlink,index = 0;
bool *onstack;
void tarjan(int v)
{
int u;
idx[v] = index;
lowlink[v] = index++;
S.push(v);
onstack[v]=true;
for (int i=0;i<G[v].size();i++)
{
u=G[v][i];
if (idx[u]==0)
{
tarjan(u);
lowlink[v] = min(lowlink[v], lowlink[u]);
}
else if (onstack[u])lowlink[v] = min(lowlink[v], idx[u]);
}
if (lowlink[v] == idx[v])
{
vector<int> sol;
do
{
u = S.top();
S.pop();
onstack[u]=false;
sol.push_back(u+1);
}while(u != v);
solutii.push_back(sol);
}
}
int main()
{
FILE* f,*out;
if(!(f = fopen("ctc.in","r")))return 0;
int n,m,i,j,nod1,nod2;
fscanf(f,"%d %d",&n,&m);
G = new vector<int>[n];
idx = new int[n];
lowlink = new int[n];
onstack = new bool[n];
for(i = 0; i < m;i++)
{
fscanf(f,"%d %d",&nod1,&nod2);
G[nod1-1].push_back(nod2-1);
}
fclose(f);
for(int i=0;i<n;i++)
idx[i]=0;
for(i = 0;i < n;i++)
if(!idx[i])tarjan(i);
out = fopen("ctc.out","w");
fprintf(out,"%d",solutii.size());
for(i = 0;i < solutii.size();i++)
{
fprintf(out,"\n");
for(j = 0;j < solutii[i].size();j++)
fprintf(out,"%d ",solutii[i][j]);
}
fclose(out);
return 1;
}