Cod sursa(job #91019)

Utilizator sealTudose Vlad seal Data 11 octombrie 2007 09:15:32
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<stdio.h>
#define Nm (1<<10)
#define Inf 1000000000
#define dist(x) (Dmin[x][I[x]]+C[x][node])
int C[Nm][Nm],Dmin[Nm][Nm],I[Nm],PostOrd[Nm],Viz[Nm],H[Nm],n,k,a,h,node;

void read()
{
    int m,x,y,c;

    freopen("pitici.in","r",stdin);
    scanf("%d%d%d",&n,&m,&k);
    while(m--)
    {
        scanf("%d%d%d",&x,&y,&c);
        C[x][y]=c; C[y][x]=-c;
    }
}

void DFS(int x)
{
    int i;

    Viz[x]=1;
    for(i=1;i<=n;++i)
        if(C[x][i]>0 && !Viz[i])
            DFS(i);
    PostOrd[++a]=x;
}

void sink(int x)
{
    int v=H[x],son=x<<1;

    while(son<=h)
    {
        if(son<h && dist(H[son|1])<dist(H[son]))
            son|=1;
        if(dist(v)<=dist(H[son]))
            break;
        H[x]=H[son]; x=son; son<<=1;
    }
    H[x]=v;
}

void solve()
{
    int i,j;

    DFS(1);

    Dmin[1][0]=0; Dmin[1][1]=Inf;
    for(i=a-1;i;--i)
    {
        node=PostOrd[i]; h=0;
        for(j=1;j<=n;++j)
            if(C[node][j]<0)
            {
                H[++h]=j;
                I[j]=0;
            }
        for(j=h>>1;j;--j)
            sink(j);

        for(j=0;j<k;++j)
        {
            Dmin[node][j]=dist(H[1]);
            if(Dmin[node][j]>=Inf)
                break;
            ++I[H[1]];
            sink(1);
        }
        Dmin[node][j]=Inf;
    }
}
            
void write()
{
    int i;

    freopen("pitici.out","w",stdout);
    for(i=0;i<k-1;++i)
        printf("%d ",Dmin[n][i]);
    printf("%d\n",Dmin[n][i]);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}