Mai intai trebuie sa te autentifici.

Cod sursa(job #1191374)

Utilizator costyrazvyTudor Costin Razvan costyrazvy Data 27 mai 2014 11:37:46
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>
#include <set>
#include <queue>
#include <vector>
#include <climits>

using namespace std;

#define NMAX 100005

queue < pair < int , int > > Q;
set < pair < int ,int > > Muchii;
vector < pair < int , int > > L[NMAX];
int Dist[NMAX];
int S,N,M,i,x,y,c;

void BFS()
{
    Q.push(make_pair(S,0));

    while (!Q.empty())
      {
          pair < int,int > nod=Q.front();

          for ( vector < pair < int , int > > :: iterator it=L[Q.front().first].begin();it!=L[Q.front().first].end();++it)
               {
                   set < pair < int ,int > > :: iterator okIt=Muchii.find(make_pair(Q.front().first,(*it).first));

                   if (okIt!=Muchii.end()) continue;

                   Muchii.insert(make_pair(Q.front().first,(*it).first));

                   if (Dist[(*it).first] <= (*it).second+Q.front().second) continue;

                   Dist[(*it).first]=Dist[Q.front().first]+(*it).second;
                   Q.push(make_pair((*it).first,Dist[(*it).first]));
               }

          Q.pop();
      }
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);

    scanf("%d%d",&N,&M);
    S=1;

    for (i=1;i<=M;++i)
        {
            scanf("%d%d%d",&x,&y,&c);

            if (x==y) continue;

            L[x].push_back(make_pair(y,c));
        }

    for (i=1;i<=N;++i) Dist[i]=INT_MAX;

    Dist[S]=0;
    BFS();

    for (i=2;i<=N;++i)
       (Dist[i]==INT_MAX) ? printf("0 ") : printf("%d ",Dist[i]);

    return 0;
}