Pagini recente » Joc pe grid | Cod sursa (job #1519343) | Cod sursa (job #1763892) | Cod sursa (job #2757331) | Cod sursa (job #854066)
Cod sursa(job #854066)
//algoritmul lui tarjan
#include <fstream>
#include <iostream>
#include <vector>
#include <stack>
#define min1(a,b) ((a) < (b) ? (a) : (b))
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
vector <int> vecini[100009];
stack <int> s;
vector <int>solutie[100009];
int index[100009];
int lowlink[100009];
int viz[100009];//e in stack
int n,m;
int ind=0;
int nr=0;
void get_data(){
in>>n>>m;
for (int i=1;i<=m;i++){
int x,y;
in>>x>>y;
vecini[x].push_back(y);
}
}
void tarjan(const int nod,const vector<int>* vecini){
int i;
index[nod]=ind;
lowlink[nod]=ind;
ind++;
viz[nod]=1;
s.push(nod);
for(i=0;i<vecini[nod].size();i++){
if (index[vecini[nod][i]]== -1){
tarjan(vecini[nod][i],vecini);
lowlink[nod]=min1(lowlink[nod],lowlink[vecini[nod][i]]);
}
else{
if (viz[vecini[nod][i]]==1){
lowlink[nod]=min1(lowlink[nod],lowlink[vecini[nod][i]]);
}
}
}
if (lowlink[nod]==index[nod]){
nr++;
int nod1;
do{
nod1=s.top();
solutie[nr].push_back(nod1);
s.pop();
viz[nod1]=0;
}
while (nod1!=nod);
cout<<nr<<'\n';
for (int j=0;j<solutie[nr].size();j++)
cout<<solutie[nr][i]<<' ';
cout<<'\n';
}
}
void init(){
for (int i=1;i<=n;i++){
viz[i]=0;
index[i]=-1;
lowlink[i]=0;
}
}
int main(){
get_data();
init();
for (int i=1;i<=n;i++){
if (index[i]==-1)
{
cout<<i<<' ';
tarjan(i,vecini);
}
}
out<<nr<<'\n';
for (int i=1;i<=nr;i++)
{
for (int j=0;j<solutie[i].size();j++){
out<<solutie[i][j]<<' ';
}
out<<'\n';
}
return 0;
}