Cod sursa(job #283931)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 20 martie 2009 19:28:08
Problema Pitici Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <stdio.h>
#include <vector>
#include <set>

#define pb push_back
#define mp make_pair
#define maxn 1039
#define maxm 200039

using namespace std;

long n, m, i, j, k, a, b, c, ok, nod, cost, fiu, ccn, f[maxn], drumuri, coa[maxn], muc[maxn];
vector <long> v[maxn], co[maxn], inv[maxn];
multiset <long> d[maxn];

void df(long nod)
{
    long ff=0;
    f[nod]=1;
    for(long y=0; y<v[nod].size(); y++)
    {
        if(f[v[nod][y]]==0) df(v[nod][y]);
        ff=1;
    }
    if(ff==0)
    {
        ccn++;
        coa[ccn]=nod;
     //   printf("%d ", nod);
    }
}

int main()
{
    multiset<long>::iterator it1, it2;
    freopen("pitici.in", "r", stdin);
    freopen("pitici.out", "w", stdout);
    scanf("%d %d %d", &n, &m, &k);
    f[1]=1;
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d", &a, &b, &c);
        v[a].pb(b); 
        muc[a]++;
        co[a].pb(c);
        inv[b].pb(a);
    }
    df(1);
    for(i=1; i<=ccn; i++)
    {
        nod=coa[i];
        for(j=0; j<inv[nod].size(); j++)
        {
            fiu=inv[nod][j];
            muc[fiu]=muc[fiu]-1;
           // printf("%d %d\n", fiu, muc[fiu]);
            if(muc[fiu]==0)
            {
                ccn++;
                coa[ccn]=fiu;
                //printf("%d ", fiu);
            }
        }
    }
    d[1].insert(0);
    for(i=ccn; i>0; i--)
    {
        nod=coa[i];
        
        for(j=0; j<v[nod].size(); j++)
        {
            fiu=v[nod][j];
            for(it1=d[nod].begin(); it1!=d[nod].end(); it1++)
            {
                cost=*it1;
                d[fiu].insert(cost+co[nod][j]);
                if(d[fiu].size()>k)
                {
                    it2=d[fiu].end();
                    it2--;
                    d[fiu].erase(it2);
                }
            }
        }
    }
    for(i=1, it1=d[n].begin(); i<=k; i++, it1++)
    {
        printf("%d ", *it1);
    }
    printf("\n");
    return 0;
}