Cod sursa(job #1599905)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 14 februarie 2016 15:12:29
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
FILE *f1=fopen("dijkstra.in","r");
FILE *f2=fopen("dijkstra.out","w");
int n,m,d[50001],i;
class comp{
  public:
      bool operator() (const int&a,const int&b){
         return d[a]>d[b];
      }
};
priority_queue<int,vector<int>,comp>Q;
struct nod{
   int inf,drum;
   nod *urm;
}*L[50001];
void adaugaresf(nod *&vf,int val1,int val2){
    nod *q;
    q=new nod;
    q->inf=val1;
    q->drum=val2;
    q->urm=vf;
    vf=q;
}
void citire(){
   fscanf(f1,"%d %d",&n,&m);
   int k,a,b,c;
   for (k=1;k<=m;k++){
      fscanf(f1,"%d %d %d",&a,&b,&c);
      adaugaresf(L[a],b,c);
      adaugaresf(L[b],a,c);
   }
   fclose(f1);
}
void dijkstra(int r){
    d[r]=0;
    nod *q;
    int x;
    Q.push(r);
    while(!Q.empty()){
        x=Q.top();
        Q.pop();
        q=L[x];
        while(q!=0){
            if (q->drum+d[x]<d[q->inf]){
                d[q->inf]=q->drum+d[x];
                Q.push(q->inf);
            }
            q=q->urm;
        }
    }
}
int main(){
   citire();
   for (i=1;i<=n;i++)
      d[i]=10000000;
   dijkstra(1);
   for (i=2;i<=n;i++){
        if (d[i]==10000000) d[i]=0;
        fprintf(f2,"%d ",d[i]);
   }
   fclose(f2);
   return 0;
}