Cod sursa(job #1241522)

Utilizator rebound212Mihnea Savu rebound212 Data 13 octombrie 2014 18:28:41
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <vector>
#include <set>
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <cstring>
#include <string>
#include <cstdio>
#include <climits>
#define PII pair < int , int >
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define LL long long
#define NMAX
#define INF INT_MAX/2

using namespace std;
vector <PII> g[50001];

PII q;
int t[50001],d[50001],j,i,n,l,x,y,Min,k,c,m;
bool sel[50001];

void dijkstra ( int p)
{   int i,k;
    for(i=1; i<=n; i++)
    {
        d[i]=(i==p) ? 0 :INF;
        t[i]=0;
        sel[i]=false;
    }
    for(i=1; i<=n; i++)
    {
        Min=INF;
        for(j=1; j<=n; j++)
        {
            if(Min>d[j]&&!sel[j])
            {
                Min=d[j];
                k=j;
            }
        }
        sel[k]=true;
        vector <PII> ::iterator it;
        for(it=g[k].begin(); it!=g[k].end(); it++)
        {
            x=(*it).S;
            c=(*it).F;
            if (d[x]>d[k] + c && !sel[x])
            {
                d[x]=d[k]+c;
                t[x]=k;
            }
        }
    }
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d",&x,&y,&l);
        q.F=l;
        q.S=y;
        g[x].PB(q);

    }
    dijkstra(1);
    for(i=2; i<=n; i++)
    {
      if(d[i]!=INF) printf("%d ",d[i]); else printf("0 ");
    }

    return 0;
}