Cod sursa(job #807541)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 4 noiembrie 2012 21:22:28
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#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;
}