Pagini recente » Cod sursa (job #165358) | Cod sursa (job #694909) | Cod sursa (job #1281354) | Cod sursa (job #1075134) | Cod sursa (job #1156146)
#include<fstream>
using namespace std;
struct nod{int info ;
nod * urm;}v[100001],*p,*w[100001];
int poz[100001],viz[100001],viz2[100001],nivel[100001],k;
void ciclu(int x, int t)
{
if(nivel[t]>nivel[x])
{
if(viz[t]==0)
{
viz[t]=++k;
}
viz[x]=viz[t];
while(x!=t)
{
viz[t]=viz[x];
t=poz[t];
}
}
}
void df(int x,int y)
{
nod *q;
q=&v[x];
while(q->urm!=NULL)
{
if(poz[q->urm->info]!=0)
{
if(q->urm->info!=y)
ciclu(x,q->urm->info);
}
else
{
poz[q->urm->info]=x;
nivel[q->urm->info]=nivel[x]+1;
df(q->urm->info,x);
}
if(q!=NULL)q=q->urm;
if(q==NULL)break;
}
}
int main()
{
int n,m,i,x,y,u=0,nr=0;
ifstream fcin("biconex.in");
ofstream fcout("biconex.out");
fcin>>n>>m;
for(i=1;i<=n;i++)
{v[i].info=0;v[i].urm=NULL;w[i]=&v[i];}
for(i=1;i<=m;i++)
{ fcin>>x>>y;
v[x].info++;
p=new nod;
p->info=y;
p->urm=NULL;
w[x]->urm=p;
w[x]=p;
v[y].info++;
p=new nod;
p->info=x;
p->urm=NULL;
w[y]->urm=p;
w[y]=p;
}
poz[1]=-1;
nivel[1]=1;
df(1,-1);
u=k;
for(i=n;i>=2;i--)
{
if(viz[i]!=viz[poz[i]]||viz[i]==0)
{
v[++u].info=-1;
p=new nod;
p->info=poz[i];
p->urm=NULL;
v[u].urm=p;
p=new nod;
p->info=i;
p->urm=NULL;
v[u].urm->urm=p;
}
else
{
if(viz2[viz[i]]==0)
{
nr++;
viz2[viz[i]]=1;
}
p=new nod;
p->info=i;
p->urm=NULL;
w[viz[i]]->urm=p;
w[viz[i]]=p;
}
}
fcout<<u-k+nr<<'\n';
fcout<<nr<<' '<<k<<' ';
return 0;
}