Cod sursa(job #253316)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 17:47:09
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.09 kb
 # include <stdio.h>  
 # include <vector>  
   
 using namespace std;  
   
 # define input "pitici.in"  
 # define output "pitici.out"  
   
 # define maxd 1021  
 # define max 1021  
   
 # define minim(a,b) (a<b?a:b)  
   
 int a[max][maxd],c[max][max],d[max];  
 int cost,aux,p;  
 int n,m,x,y,l,i,k,j,K;  
 int coada[max],inc[max];  
 vector < vector < int > > v,v1;  
   
 struct ee  
 {  
        int a,r;  
 }h[max];  
   
 void heapup(ee a[maxd],int val,int r)  
 {  
     a[0].a ++;  
     a[a[0].a].a = val;  
     a[a[0].a].r = r;  
     int pos = a[0].a;  
     while(pos>1)  
     {  
         if(a[pos/2].a > a[pos].a)  
         {  
             ee aux = a[pos];  
             a[pos] = a[pos/2];  
             a[pos/2] = aux;  
             pos/=2;  
         }  
         else  
             pos = 1;  
     }  
 }  
   
 void coboarah(ee a[maxd])  
 {  
     int sz = a[0].a;  
     int p;  
     p  = 1;  
     while(2*p <= sz)  
     {  
         int x = 2*p;  
         if(x + 1<= sz)  
             if(a[x].a > a[x+1].a)  
                 x++;  
         if(a[p].a > a[x].a)  
         {  
            ee aux = a[p];  
            a[p] = a[x];  
            a[x] = aux;  
            p = x;      
         }      
         else  
            p = sz;  
     }  
 }  
   
 int main()  
 {  
     freopen(input, "r", stdin);  
     freopen(output, "w", stdout);  
       
     scanf("%d%d%d",&n,&m,&K);  
       
     v.resize(n+1);  
     v1.resize(n+1);  
       
     for(i=1;i<=m;i++)  
     {  
        scanf("%d%d%d",&x,&y,&cost);  
        c[x][y] = cost;  
        v[y].push_back(x);  
        v1[x].push_back(y);  
        inc[x]++;  
     }  
     l = n;  
       
     for(i=1;i<=n;i++)  
         if(!inc[i])  
            coada[l--] = i;  
     int st = n;  
     while(st)  
     {  
        i = coada[st];  
        for(k=0;k<v[i].size();k++)  
        {  
           j = v[i][k];  
           inc[j] --;  
           if(inc[j] == 0)  
                     coada[l--] = j;  
        }  
        st--;  
     }  
     a[1][0] = 1;  
     a[1][1] = 0;  
     int e;  
       
     for(e=2;e<=n;e++)  
     {  
         i = coada[e];  
         h[0].a = 0;  
           
         for(j = 0;j < v[i].size();j++)  
         {  
             k = v[i][j];  
             d[k] = 1;  
             heapup(h,a[k][1] + c[k][i],k);  
         }  
         int nr = 0;  
         while(h[0].a && nr < K)  
         {  
             nr++;  
             ee p = h[1];  
             a[i][++a[i][0]] = p.a;  
             if(d[p.r] < a[p.r][0])  
             {  
                 d[p.r]++;  
                 h[1].a = a[h[1].r][d[p.r]] + c[h[1].r][i];  
                 coboarah(h);  
             }  
             else  
             {  
                 h[1] = h[h[0].a];  
                 h[0].a--;  
                 coboarah(h);  
             }  
         }

     }  
           
     for(i=1;i<=K;i++)  
     {  
         printf("%d ",a[n][i]);  
     }      
       
     return 0;  
}