Cod sursa(job #285019)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 22 martie 2009 11:43:27
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <stdio.h>
#include <vector>
#include <set>
#include <queue>

#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, tata, nod, fiu, ccn, poz;
long f[maxn], coa[maxn], muc[maxn], it[maxn];
vector <long> v[maxn], inv[maxn]; 
long cost[maxn][maxn];
long d[maxn][maxn], dim[maxn];
priority_queue < pair<long, long> > heap;

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;
    }
}

int main()
{
    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]++;
        inv[b].pb(a);
        cost[b][a]=c;
        cost[a][b]=c;
    }
    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;
            if(muc[fiu]==0)
            {
                ccn++;
                coa[ccn]=fiu;
            }
        }
    }
    d[1][1]=0;
    dim[1]=1;
    for(i=ccn-1; i>0; i--)
    {
        nod=coa[i];
        while(!heap.empty())
        {
            heap.pop();
        }
        for(j=0; j<inv[nod].size(); j++)
        {
            tata=inv[nod][j];
            if(dim[tata]!=0)
            {
                heap.push(mp(-(d[tata][1]+cost[nod][tata]), tata));
                it[tata]=1;
            }
        }
    //    printf("%d: ", nod);
        for(j=1; j<=k && !heap.empty(); j++)
        {
            d[nod][j]=-(heap.top().first);
          //  printf("%d ", d[nod][j]);
            tata=heap.top().second;
            heap.pop();
            it[tata]++;
            if(it[tata]<=dim[tata]) heap.push(mp(-(d[tata][it[tata]]+cost[nod][tata]), tata));
            dim[nod]++;
        }
      //  printf("\n");
    }
    for(i=1; i<=k; i++)
    {
        printf("%d ", d[n][i]);
    }
    printf("\n");
    return 0;
}