Cod sursa(job #1226444)

Utilizator gabib97Gabriel Boroghina gabib97 Data 5 septembrie 2014 14:28:55
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <ctype.h>
#define pp pair<int,int>
#define inf 100000000
using namespace std;
int n,m,x,y,c,s,i,*d,z,lg,j;
char *b;
vector<pp> G[50005];
class comp
{
public:
 bool operator() (const int& a, const int& b)
  {
    return (d[a]>d[b]);
  }
};
priority_queue<int, vector<int> ,comp> Q;
void init()
{
    fseek(stdin,0,SEEK_END);
    lg=ftell(stdin);
    rewind(stdin);
    b=(char*) calloc(lg,sizeof(char));
    fread(b,1,lg,stdin);
    for (i=0;isdigit(b[i]);i++) n=n*10+b[i]-'0';
    for (z=i+1;isdigit(b[z]);z++) m=m*10+b[z]-'0';
    s=1;
    Q.push(s);
    for(j=1;j<=m;j++)
    {
        x=y=c=0;
        for (i=z+1;isdigit(b[i]);i++) x=x*10+b[i]-'0';
        z=i;
        for (i=z+1;isdigit(b[i]);i++) y=y*10+b[i]-'0';
        z=i;
        for (i=z+1;isdigit(b[i]);i++) c=c*10+b[i]-'0';
        z=i;
        G[x].push_back(pp(y,c));
    }
    free(b);
    d=(int*) calloc(n+2,sizeof(int));
    for (i=1;i<=n;i++) d[i]=inf;
    d[s]=0;
}
void dijkstra()
{
    while(!Q.empty())
    {
        x = Q.top();
        Q.pop();
        z = G[x].size();
        for(i=0;i<z;i++)
        {
            y = G[x][i].first;
            c = G[x][i].second;
            if(d[y] > d[x] + c)
            {
                d[y] = d[x] + c;
                Q.push(y);
            }
        }
    }
}
int main()
{
    freopen ("dijkstra.in","r",stdin);
    freopen ("dijkstra.out","w",stdout);
    init();
    dijkstra();
    for(i=2;i<=n;i++)
    {
        if (d[i]!=inf) printf("%i",d[i]);
        else printf("0");
        if (i<n) printf(" ");
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}