Cod sursa(job #940438)

Utilizator rudarelLup Ionut rudarel Data 16 aprilie 2013 11:24:00
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
 
using namespace std;
 
#define sz(c) int((c).size())
#define pb push_back
#define ii pair<int, int>
#define mp make_pair
#define x first
#define y second
 
#define Nmax 1024
 
int n, k;
vector< pair<int, int> > G[Nmax], G2[Nmax];
 
char viz[Nmax];
int v[Nmax], cnt;
 
vector<int> list[Nmax];
priority_queue< ii, vector<ii>, greater<ii> > H;
int dist[Nmax], ind[Nmax];
 
void readdata()
{
    freopen("pitici.in", "r", stdin);
    freopen("pitici.out", "w", stdout);
 
    int i, a, b, c, m;
 
    scanf("%d %d %d", &n, &m, &k);
    for (i = 1; i <= m; ++i)
    {
        scanf("%d %d %d", &a, &b, &c);
        G[a].pb( mp(b, c) );
        G2[b].pb( mp(a, c) );
    }
}
 
void df(int k)
{
    int i, nod;
 
    viz[k] = 1;
    for (i = 0; i < sz(G[k]); ++i)
    {
        nod = G[k][i].x;
        if (!viz[nod]) df(nod);
    }
    v[++cnt] = k;
}
 
void solve()
{
    int i, j, nod, nod2;
    ii p;
 
    df(1);
 
    list[1].pb(0);
    for (i = cnt-1; i; --i)
    {
        nod = v[i];
        while (!H.empty()) H.pop();
        for (j = 0; j < sz(G2[nod]); ++j)
        {
            nod2 = G2[nod][j].x;
            dist[nod2] = G2[nod][j].y;
            ind[nod2] = 1;
            H.push( mp(list[nod2][0] + dist[nod2], nod2) );
        }
        for (j = 1; j <= k && !H.empty(); ++j)
        {
            p = H.top();
            H.pop();
            list[nod].pb(p.x);
            if (ind[p.y] < sz(list[p.y]))
                H.push( mp(list[p.y][ind[p.y]++] + dist[p.y] , p.y) );
        }
    }
}
 
void writedata()
{
    int i;
 
    for (i = 0; i < k; ++i)
        printf("%d ", list[n][i]);
}
 
int main()
{
    readdata();
    solve();
    writedata();
    return 0;
}