Cod sursa(job #902527)

Utilizator MihaiPParpalea Mihai MihaiP Data 1 martie 2013 14:46:21
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.7 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
#include <memory.h>
#define oo 0x3f3f3f3f

using namespace std;

vector < pair <int,int> >adj[50003];

int N,M,D[50004];
 FILE *fout=fopen ("dijkstra.out","w");

void dijkstra(int start)
{

    for(int i=0;i<N;i++) D[i]=oo;
        D[start]=0;
        set<pair<int,int> >pq;  //creare coada
        pq.insert(make_pair(0,start)); //inserare startul in coada

        while(!pq.empty())
        {
            int node=pq.begin()->second; //selectez nodul curent ca a doua val din coada
            pq.erase(pq.begin());        //scot nodul curent din coada

            for(int i=0;i < (int)(adj[node].size()); i++) //parcurg toti vecinii lui nodc prin adj[node]
                {
                    if(D[node]+adj[node][i].second >= D[adj[node][i].first]) continue; // compar daca distanta de la
                                                                                      // node+costul pana in adj[node][i].second
                                                                                      // <= distanta curenta de la node la adj[node][i].first
          //daca e
                    if(D[adj[node][i].first] < oo)//il scot din coada
                        pq.erase(pq.find(make_pair(D[adj[node][i].first], adj[node][i].first)));//il scot din coada

                    D[adj[node][i].first] = D[node] + adj[node][i].second; //actualizez distanta
                    pq.insert( make_pair ( D[adj[node][i].first] , adj[node][i].first)); //pun in coada distanta si nodul

                }
        }
        for(int i=0;i<N;i++)
            {if(i!=start)fprintf (fout,"%d ", D[i] == oo ? 0 : D[i]);
            }
}

int main()
{
    int x,y,c;

    FILE *fin= fopen("dijkstra.in","r");
        fscanf (fin,"%d%d",&N,&M);
    for(int i=0;i<M;i++)
        {fscanf (fin,"%d%d%d",&x,&y,&c);
        x--;y--;
         adj[x].push_back(make_pair(y,c));
        }



    dijkstra(0);

    return 0;
}

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

 FILE *fin=fopen("djikstra.in","r");


int main()
{

       int n, m, X, Y, C;
        fscanf(fin,"%d%d",&n,&m);
    for(int i =1;i <=m ;i++)
        {
         fscanf(fin,"%d%d%d",&X,&Y,&C);
       if(X!=Y)
         {
         aux=new nod;
         aux->cost=C;
         aux->inf=X;
         aux->next=prim[Y];
         prim[Y]=aux;

         aux=new nod;
         aux->cost=C;
         aux->inf=Y;
         aux->next=prim[X];
         prim[X]=aux;
         }
        }

    int d[50001],pred[50001],viz[50001];
    memset(viz,0,sizeof(viz));

    for(int i=1;i<=n;i++)d[i]=oo;
    d[1]=0;
  int con=0,min,dmin;

  while(con<n)
  {
   dmin=oo;con++;
   for(int i=1;i<=n;i++) if(d[i]<dmin && viz[i]==0) {min=i;dmin=d[i];}
    viz[min]=1;
    for(p=prim[min];p;p=p->next)
        if (d[p->inf]>d[min]+p->cost)
                {d[p->inf]=d[min]+p->cost;
                 pred[p->inf]=min;
                }
  }
  for(int i=1;i<=n;i++)
    cout<<d[i]<<" ";

int n=10,vect[123];

for(int i=1;i<=n;i++)
    fscanf(fin,"%d",&vect[i]);

  vector<int> v(vect,vect+n+1);

  make_heap (v.begin(),v.end());
  cout << "initial max heap   : " << v.front() << '\n';

  pop_heap (v.begin(),v.end());v.pop_back();
  cout << "max heap after pop : " << v.front() << '\n';

  v.push_back(123); std::push_heap (v.begin(),v.end());
  cout << "max heap after push: " << v.front() << '\n';

  sort_heap (v.begin(),v.end());

  cout << "final sorted range :";
    for (int  i=1; i<=n; i++)
     cout << ' ' << v[i];


    return 0;
}
*/