Cod sursa(job #2283088)

Utilizator Monstergentleman35Ciopraga Razvan Monstergentleman35 Data 14 noiembrie 2018 23:09:05
Problema Componente biconexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.84 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("biconex.in");
ofstream fout("biconex.out");

struct elem
{
 int val;
 elem *next;
};

struct item
{
 elem *st,*cur;
};

struct Mem
{
 int tata,fiu;
};

struct elemgr
{
 int val;
 elemgr* next;
};

struct Memgrupa
{
 elemgr *st,*cur;
};

int n,m,a,b,q,i,iaux,nrparc,nrmem;
int nrramuri,nrgrupe,nrpart;
elem *leg;
elemgr *atas,*iaux3;
item Adiac[100005];
Memgrupa Grupa[100005];
int dfn[100005];
int low[100005];
bool Art[100005];
Mem Stiva[200005];

void biconex(int,int);
void taierecomp(int,int);
bool apartine(int);

int main()
{
 fin>>n>>m;
 for (i=1;i<=n;i++)
 {
  Adiac[i].st=new elem;
  Adiac[i].st->next=0;
  Adiac[i].st->val=0;
  Adiac[i].cur=Adiac[i].st;
  Grupa[i].st=new elemgr;
  Grupa[i].st->val=0;
  Grupa[i].st->next=0;
  Grupa[i].cur=Grupa[i].st;
 }
 for (i=1;i<=m;i++)
 {
  fin>>a>>b;
  leg=new elem;
  leg->next=0;
  leg->val=b;
  Adiac[a].cur->next=leg;
  Adiac[a].cur=leg;
  leg=new elem;
  leg->next=0;
  leg->val=a;
  Adiac[b].cur->next=leg;
  Adiac[b].cur=leg;
 }
 biconex(1,-1);
  for (i=1;i<=nrgrupe;i++)
  {
   iaux3=Grupa[i].st->next;
   while (iaux3!=NULL)
   {
    fout<<iaux3->val<<" ";
    iaux3=iaux3->next;
   }
   fout<<"\n";
  }
 return 0;
}

void biconex(int x,int tx)
{
 elem *i2;
 int y;
 nrparc++;
 dfn[x]=low[x]=nrparc;
 i2=Adiac[x].st->next;
 while (i2!=NULL)
 {
  y=i2->val;
  if (y!=tx&&dfn[y]<dfn[x])
  {
   nrmem++;
   Stiva[nrmem].tata=x;
   Stiva[nrmem].fiu=y;
  }
  if (dfn[y]==0)
  {
   if (x==1)
    nrramuri++;
   biconex(y,x);
   low[x]=min(low[x],low[y]);
   if (dfn[x]<=low[y])
   {
    if (x!=1)
    {
     Art[x]=1;
     nrpart++;
    }
    taierecomp(y,x);
   }
  }
  else
  {
   if (y!=tx)
    low[x]=min(low[x],dfn[y]);
  }
  i2=i2->next;
 }
}

void taierecomp(int x,int tx)
{
 Mem a1;
 nrgrupe++;
 while ((Stiva[nrmem].fiu!=x)||(Stiva[nrmem].tata!=tx&&nrmem>0))
 {
  a1=Stiva[nrmem];
  if (!apartine(a1.fiu))
  {
  atas=new elemgr;
  atas->val=a1.fiu;
  atas->next=0;
  Grupa[nrgrupe].cur->next=atas;
  Grupa[nrgrupe].cur=atas;
  }
  if (!apartine(a1.tata))
  {
  atas=new elemgr;
  atas->val=a1.tata;
  atas->next=0;
  Grupa[nrgrupe].cur->next=atas;
  Grupa[nrgrupe].cur=atas;
  }
  nrmem--;
 }
  a1=Stiva[nrmem];
  if (!apartine(a1.fiu))
  {
  atas=new elemgr;
  atas->val=a1.fiu;
  atas->next=0;
  Grupa[nrgrupe].cur->next=atas;
  Grupa[nrgrupe].cur=atas;
  }
  if (!apartine(a1.tata))
  {
  atas=new elemgr;
  atas->val=a1.tata;
  atas->next=0;
  Grupa[nrgrupe].cur->next=atas;
  Grupa[nrgrupe].cur=atas;
  }
  nrmem--;
}

bool apartine(int x)
{
 elemgr *iaux2;
 iaux2=Grupa[nrgrupe].st->next;
 while (iaux2!=NULL)
 {
  if (iaux2->val==x)
   return 1;
  iaux2=iaux2->next;
 }
 return 0;
}