Cod sursa(job #237305)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 29 decembrie 2008 15:48:47
Problema Strazi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include<stdio.h>
struct Nod {
    int x;
    Nod *next;
};
int n;
int sir[605];
int ok;
int viz[300];
int x;
int l[300];
int r[300];
Nod *a[260];
int y;
int use[300];
int sol;
int m;
void insert(Nod *&u, int v)
{
    Nod *k = new Nod;
    k -> x = v;
    k -> next = u;
    u = k;
}
int PrUp(int i)
{
    if (use[i]) return 0;
    use[i] = 1;

    for(Nod *it = a[i]; it; it = it -> next)
        if (!l[it->x])
           {
               l[it->x] = i;
               r[i] = it -> x;
               return 1;
           }
     for(Nod *it = a[i]; it; it = it -> next)
      if (PrUp(l[it->x]))
           {
               l[it->x] = i;
               r[i] = it -> x;
               return 1;
           }
    return 0;
}
int main()
{
    freopen("strazi.in","r",stdin);
    freopen("strazi.out","w",stdout);

    scanf("%d %d",&n,&m);
    for(int i = 1; i <= m; i++)
     {
      scanf("%d %d",&x,&y);
      insert(a[x],y);
     }
    while (!ok)
     {
         ok = 1;
         for(int i = 1; i <= n; i++)
          use[i] = 0;
         for(int i = 1; i <= n; i++)
          if (!r[i])
           if (PrUp(i))
            {
                sol++;
                ok = 0;
            }

     }
    for(int i = 1; i <= n; i++)
     if (!viz[i])
      {
          x = i;
          while (r[x])
            {
                sir[++sir[0]] = x;
                x = r[x];
                viz[x] = 1;
            }
         sir[++sir[0]] = x;
         sir[0]++;
      }
    printf("%d \n",sol);
    for(int i = 1; i <= sir[0] -1; i++)
     if (sir[i] == 0)
      printf("%d %d \n",sir[i-1],sir[i+1]);
    for(int i = 1; i <= sir[0]; i++)
     if (sir[i] != 0) printf("%d ",sir[i]);
    return 0;
}