Pagini recente » Cod sursa (job #2932182) | Cod sursa (job #376272) | Cod sursa (job #1042442) | Cod sursa (job #990786) | Cod sursa (job #807541)
Cod sursa(job #807541)
#include<fstream>
#include<cstring>
using namespace std;
typedef struct celula{
int nod;
celula *next;
}*lista;
lista graf[266],v;
int n,m,l[266],r[266],viz[266],tata[266],fiu[266],lant[266][266],q[266];
bool cupleaza(int sursa) {
lista p;
if(viz[sursa]) return(false);
viz[sursa]=1;
for(p=graf[sursa];p; p=p->next)
if(!r[p->nod]){
l[sursa]=p->nod;
r[p->nod]=sursa;
return true;
}
for(p=graf[sursa];p; p=p->next)
if(cupleaza(r[p->nod])) {
l[sursa]=p->nod;
r[p->nod]=sursa;
return(true);
}
return(false);
}
int main(void){
int i,x,y,sol=0;
bool ok=true;
ifstream fin("strazi.in");
ofstream fout("strazi.out");
fin>>n>>m;
for(i=1; i<=m; i++) {
fin>>x>>y;
v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v;
}
while (ok) {
ok=false;
memset(viz,0,sizeof(viz));
for(i=1; i<=n; ++i) if(!l[i]) ok=ok|cupleaza(i);
}
for(i=1; i<=n; ++i) if(l[i]) { tata[l[i]]=i; fiu[i]=l[i]; }
for (i=1; i<=n; ++i) if (tata[i]==0) {++sol; int k=i; while (k) {++q[sol]; lant[sol][q[sol]]=k; k=fiu[k];} }
fout<<(sol-1)<<"\n";
for (i=1; i<sol; ++i) fout<<lant[i][q[i]]<<" "<<lant[i+1][1]<<"\n";
for (i=1; i<=sol; ++i)
for (int j=1; j<=q[i]; ++j) fout<<lant[i][j]<<" ";
return 0;
}