Cod sursa(job #856001)

Utilizator lianaliana tucar liana Data 15 ianuarie 2013 21:30:57
Problema Pitici Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<stdio.h>
#include<vector>
#include<set>
using namespace std;
#define nmax 1025
struct element{long n, c;};
long n, m, i, a, b, c, inc, sf, el, k;
long gr[nmax], co[nmax], poz[nmax], cost[nmax], sol[nmax][nmax];
vector <element> ma[nmax], an[nmax];
vector <element> ::iterator it;
set <pair <long, long> > h;
set <pair <long, long> > ::iterator pr;
element mch, x;

void citire()
{
    scanf("%ld %ld %ld",&n,&m,&k);
    for (i=1;i<=m;i++)
    {
        scanf("%ld %ld %ld",&a,&b,&c);
        mch.n=b;    mch.c=c;    ma[a].push_back(mch);
        mch.n=a;    mch.c=c;    an[b].push_back(mch);
        gr[b]++;
    }
}

void rezolvare()
{
    sol[1][0]=1;
    co[++sf]=1; inc=1;
    while (inc<=sf)
    {
        el=co[inc]; inc++;
        h.clear();
        for (it=an[el].begin();it!=an[el].end();it++)
        {
            h.insert(make_pair(sol[(*it).n][1]+(*it).c,(*it).n));
            poz[(*it).n]=1;
            cost[(*it).n]=(*it).c;
        }
        for (i=1;((i<=k)&&(h.size()));i++)
        {
            pr=h.begin();
            sol[el][++sol[el][0]]=(*pr).first;
            poz[(*pr).second]++;
            if (poz[(*pr).second]<=sol[(*pr).second][0])
                h.insert(make_pair(sol[(*pr).second][poz[(*pr).second]]+ cost[(*pr).second], (*pr).second));
            h.erase(h.begin());
        }
        for (it=ma[el].begin();it!=ma[el].end();it++)
        {
            x=*it;
            gr[x.n]--;
            if (!gr[x.n])
                co[++sf]=x.n;
        }
    }
}

void afisare()
{
    for (i=1;i<=k;i++)
        printf("%ld ",sol[n][i]);
}

int main()
{
    freopen("pitici.in","r",stdin);
    freopen("pitici.out","w",stdout);
    citire();
    rezolvare();
    afisare();
    return 0;
}