Cod sursa(job #2007852)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 4 august 2017 12:22:42
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <utility>

using namespace std;

int i,j,n,m,k;

vector<pair<int,int> > C[1024];

int __min[1024][1024];
int T[1024];
pair<int,int> heap[1024];
int pus[1024];

vector <int> ord;
void readdata(){
    FILE *f=fopen ("pitici.in","r");
    fscanf (f,"%d%d%d",&n,&m,&k);

    for (i=1;i<=m;i++){
        int a,b,c;
        fscanf (f,"%d%d%d",&a,&b,&c);
        C[b].push_back(make_pair(a,c));
    }
}

void df(int x){
    pus[x]=1;
    int i;

    for (i=0;i<C[x].size();i++)
        if (!pus[C[x][i].first]) df(C[x][i].first);
    ord.push_back(x);
}

int MIN(int a,int b){
    int ca=(a<=m)?__min[heap[a].first][T[heap[a].first]]+heap[a].second:1000000000;
    int cb=(b<=m)?__min[heap[b].first][T[heap[b].first]]+heap[b].second:1000000000;
    if (ca<cb) return a;
    return b;
}

void swap(int x,int y){
    pair<int,int>P;
    P=heap[x];
    heap[x]=heap[y];
    heap[y]=P;
}

void heapup(int i){
    if (i!=1){
        if (MIN(i,i/2)==i) swap(i,i/2),heapup(i/2);
    }
}

void heapdown(int i){
    int k=MIN(i*2,i*2+1);
    if (MIN(k,i)!=i) swap(i,k),heapdown(k);
}

void solve()
{
    for (i=n;i>0;i--)
        if (!pus[i]) df(i);
    memset(pus,0,sizeof(pus));
    pus[1]=1;
    memset(__min,1,sizeof(__min));
    __min[1][1]=0;

    for (i=1;i<n;i++){
        for (j=1;j<=n;j++)
                T[j]=1;
        int nod=ord[i];

        m=0;

        for (int x=0;x<C[nod].size();x++){
            m++;
            heap[m].first=C[nod][x].first;
            heap[m].second=C[nod][x].second;
            heapup(m);
        }

        for (;m&&pus[nod]<=k;){
            __min[nod][ ++pus[nod] ]=__min[heap[1].first][T[heap[1].first]++]+heap[1].second;
            if (T[heap[1].first]<=pus[heap[1].first]) heapdown(1);
            else swap(1,m),m--,heapdown(1);
        }
    }
}

void writedata(){
    FILE *f=fopen ("pitici.out","w");
    if (pus[n]<k) printf ("Prea putine drumuri!!");;
    for (i=1;i<k;i++)
        fprintf (f,"%d ",__min[n][i]);
    fprintf (f,"%d\n",__min[n][k]);
    fclose (f);
}

int main()
{
    readdata();
    solve();
    writedata();

    return 0;
}