Cod sursa(job #161925)

Utilizator DorinOltean Dorin Dorin Data 18 martie 2008 23:22:12
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.79 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);
            }
        }/*
        printf("%d : ",i);
        for(j=1;j<=K;j++)
           printf("%d ",a[i][j]);
        printf("\n");*/
        
    }
        
    for(i=1;i<=K;i++)
    {
        printf("%d ",a[n][i]);
    }    
    
    return 0;
}