Pagini recente » Cod sursa (job #1468673) | Cod sursa (job #2875669) | Cod sursa (job #2355817) | Cod sursa (job #1845333) | Cod sursa (job #2283088)
#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;
}