Cod sursa(job #136898)

Utilizator floringh06Florin Ghesu floringh06 Data 16 februarie 2008 13:36:31
Problema Pioni Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.87 kb
#include <cstdio>  
#include <cstdlib>  

using namespace std;
  
#define FIN "pioni.in"  
#define FOUT "pioni.out"  
#define MAX_N 20005
#define MAX_K 30005  
    
int T, N, M, K;

int *A[MAX_N];  

int dg[MAX_N];  
int S[MAX_N];
int D[MAX_K];  
  
     void DFS(int nod)  
     {  
         if (S[nod]) return;  // ne intoarcem
         for (int i = 1; i <= dg[nod]; ++i)  
         {  
             DFS(A[nod][i]);  
             if (S[A[nod][i]] == 2)  
             {  
                  S[nod] = 1; return ;  
             }  
         } 
         S[nod] = 2;  
    }  

    void grade ( void )
    {
         int i, a, b;
         
         scanf("%d %d %d",&T, &N, &M);  
         for (i = 1; i <= M; ++i)  
         {  
             scanf("%d %d", &a, &b); dg[a]++;  
         }  
         for (i = 1; i <= N; ++i)  
         {  
             A[i] = (int *) realloc(A[i], sizeof(int) * (dg[i] + 1));  dg[i] = 0;  
         }
    }
         
         
  
    void solve()  
    {  
         int i, j, a, b;
         int BEST;  
         int Ax;  
    
         freopen(FIN, "r", stdin);  
  
         scanf("%d %d %d",&T, &N, &M);  
         for (i = 1; i <= M; ++i)  
         {  
             scanf("%d %d",&a, &b); A[a][++dg[a]] = b;  
         }  
  
         for (i = 1; i <= N; ++i) DFS(i);  
  
         while (T)  
         { 
               scanf("%d", &K);  
               BEST = 2;  Ax = 0;  
  
               for (i = 1; i <= K; ++i)  
               {  
                   scanf("%d", D + i);  
                   if (S[D[i]] == 1) ++Ax;  
               }  
  
               if (Ax)  
               {
                        /*
                        printf ("%d\n", A[a][j]);
                        for (i = 1; i <= K; ++i)
                            for (S[Ax] = 1, a = D[i]; i <= K; ++i)
                                A[D[i]] = S[++a];
                        */  
                        printf("Nargy\n"); printf("%d", Ax);  
                        for (i = 1; i <= K; ++i)  
                            if (S[D[i]] == 1)  
                            {  
                                a = D[i];  
                                for (j = 1; j <= dg[a]; ++j)  
                                    if (S[A[a][j]] == 2)  
                                    {  
                                       printf(" %d %d", a, A[a][j]); break;  
                                    }  
                            }  
                        // printf ("%d\n", a);     
                        printf("\n");  
               }  
               else printf("Fumeanu\n");  
               --T;
        }  
    }  
  
    int main()  
    {  
        freopen(FIN, "r", stdin);  
        freopen(FOUT, "w", stdout); 
        
        grade ();
        solve ();  
        
        return 0;  
    }