Cod sursa(job #1111055)

Utilizator BiancadarBianca Darolti Biancadar Data 18 februarie 2014 16:45:23
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <cstdio>

using namespace std;

struct nod {int inf;
    int cost;
    nod *next;}*prim[1001],*p,*aux;

int viz[1001],t[1001],d[1001],h[1001];

int main()
{
    FILE *fin=fopen("dijkstra.in","r"),
        *fout=fopen("dijkstra.out","w");
    int x,y,z,i,s,f,j,c,n,m,k,l;
    fscanf(fin,"%d %d",&n,&m);
    for(i=1;i<=m;i++)
    {
        fscanf(fin,"%d %d %d\n",&x,&y,&c);
        aux=new nod;
        aux->inf=y;
        aux->cost=c;
        aux->next=prim[x];
        prim[x]=aux;
        aux=new nod;
        aux->inf=x;
        aux->cost=c;
        aux->next=prim[y];
        prim[y]=aux;
    }
    fscanf(fin,"%d %d",&s,&f);
    for(i=1;i<=n;i++) if(i!=s) t[i]=s,d[i]=99999;
    viz[s]=1;
    for(p=prim[s];p;p=p->next)
        d[p->inf]=p->cost;
    l=0;
    for(i=1;i<=n;i++)
    {
        if(i!=s)
        {
            h[++l]=i;
            x=l;
            y=x/2;
            while(y && d[h[y]]>d[h[x]])
            {
                z=h[x];
                h[x]=h[y];
                h[y]=z;
                x=y;
                y/=2;
            }
        }
    }
    l=n-1;
    for(i=1;i<n;i++)
    {
        k=h[1];
        viz[k]=1;
        for(p=prim[k];p;p=p->next)
        {
            if(!viz[p->inf] && d[k]+p->cost<d[p->inf])
                d[p->inf]=d[k]+p->cost,t[p->inf]=k;
        }
        h[1]=h[l--];
        x=1;
        while(1)
        {
            y=2*x;
            if(y>l) break;
            if(d[h[y]]<=l && d[h[y]]>d[h[y+1]]) y++;
            if(d[h[y]]<d[h[x]])
            {
                z=h[x];
                h[x]=h[y];
                h[y]=z;
                x=y;
            }
            else break;
        }
    }
    fprintf(fout,"%d ",f);
    while(t[f])
    {
        fprintf(fout,"%d ",t[f]);
        f=t[f];
    }
    return 0;
}