Cod sursa(job #237522)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 29 decembrie 2008 22:40:28
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include<stdio.h>
struct Nod {
    int x;
    Nod *next;
};
int n;
int sir[605];
int prt[305];
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])
      {
          int cap = 300;
          sir[0] = 300;
          x = i;
          while (r[x] && !viz[r[x]])
            {
                sir[++sir[0]] = x;
                viz[x] = 1;
                x = r[x];
            }
         sir[++sir[0]] = x;
         viz[x] = 1;
         x = i;
         while (l[x] && !viz[l[x]])
            {
                sir[cap--] = l[x];
                viz[l[x]] = 1;
                x = l[x];
            }
         for(int j = cap + 1; j <= sir[0]; j++)
           prt[++prt[0]] = sir[j];
         prt[0]++;

      }
    printf("%d \n",n - sol -1);
    for(int i = 1; i <= prt[0] -1; i++)
     if (prt[i] == 0)
      printf("%d %d \n",prt[i-1],prt[i+1]);
    for(int i = 1; i <= prt[0]; i++)
     if (prt[i] != 0) printf("%d ",prt[i]);
    return 0;
}