Cod sursa(job #148033)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 3 martie 2008 20:41:18
Problema Algoritmul lui Dijkstra Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <stdio.h>
#include <vector>
#define inf 2000000000
#define nMax 50005

using namespace std;

long d[nMax];
long q[nMax];
long poz[nMax];
long n,m,k,i,j,r;
long x,y,z;
vector <long> v[nMax],c[nMax];

void swap(long &a,long &b){
     long aux=a;
     a=b;
     b=aux;
}

void scufunda(long i){
     long fiu;
     while ((long)(i<<1)<=k){
           fiu=i<<1;
           if ((long)(fiu|1)<=n)
              if (d[q[fiu|1]]<d[q[fiu]])fiu|=1;
           if (d[q[fiu]]<d[q[i]]){
              swap(q[i],q[fiu]);
              poz[q[i]]=i;
              poz[q[fiu]]=fiu;
              i=fiu;
           }
           else break;
     }
}

void ridica(long i){
    // if (i==2) 
     long val=q[i];
     while (i>1 && d[val]<d[q[i>>1]]){
           q[i]=q[i>>1];
           poz[q[i]]=i;
           i>>=1;
     }      
     q[i]=val;
     poz[q[i]]=i;
}

long get_min(){
     swap(q[1],q[k]);
     poz[q[1]]=1;
     poz[q[k]]=k;
     k--;
     scufunda(1);
     return q[k+1];
}

void output(){
     for (i=1;i<=n;i++)
         if (i!=r)
            if (d[i]==inf)printf("0 ");
            else printf("%ld ",d[i]);
}

void dijkstra(){
     //initializare
     for (i=1;i<=n;i++){
         poz[i]=q[i]=i;
         d[i]=inf;
     }
     d[r]=0;
     k=n;
     while (k){
           /*
           for (i=1;i<=k;i++)
               printf("%ld ",q[i]);
           printf("\n");
           for (i=1;i<=k;i++)
               printf("%ld ",d[q[i]]);
           printf("\n\n");
           */
           long nod_min=get_min();
           
           //if (d[nod_min]==inf)break;
           for (i=0;i<v[nod_min].size();i++)
               if (d[v[nod_min][i]]>d[nod_min]+c[nod_min][i]){
                  d[v[nod_min][i]]=d[nod_min]+c[nod_min][i];
                  ridica(poz[v[nod_min][i]]);
               }
     }
     output();
}

int main(){
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    
    scanf("%ld %ld",&n,&m);
    r=1;//nod sursa
    for (i=1;i<=m;i++){
        scanf("%ld %ld %ld",&x,&y,&z);
        v[x].push_back(y);
        c[x].push_back(z);
    }
    
    dijkstra();

return 0;
}