Cod sursa(job #1301575)

Utilizator refugiatBoni Daniel Stefan refugiat Data 26 decembrie 2014 08:47:43
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<list>
#include<limits.h>
#include<bitset>
using namespace std;
struct drum
{
    int d;
    int l;
};
list<drum> l[50000];
void dijkstra(int n)
{
    int i;
    int m[n+1];
    int j;
    bitset<50000> fol;
    for(i=1;i<=n;++i)
    {
        m[i]=INT_MAX;
        fol[i-1]=0;
    }
    m[0]=0;
    int d[n];
    d[0]=0;
    int minn,z=0;
    for(i=0;i<n-1;++i)
    {
        fol[z]=1;
        list<drum>::iterator k;
        drum x;
        minn=INT_MAX;
        for(k=l[z].begin();k!=l[z].end();++k)
        {
            x=*k;
            if(m[x.d+1]>m[0]+x.l)
            {
                m[x.d+1]=m[0]+x.l;
            }
        }
        for(j=1;j<=n;++j)
        {
            if(m[j]<=minn)
                if(fol[j-1]==0)
                {
                    minn=m[j];
                    z=j-1;
                }
        }
        d[z]=m[z+1];
        m[0]=minn;
    }
    FILE* so=fopen("dijkstra.out","w");
    for(i=1;i<n;++i)
    {
        if(d[i]==INT_MAX)
            fprintf(so,"0 ");
        else
            fprintf(so,"%i ",d[i]);
    }
    fprintf(so,"\n");
}
int main()
{
    ifstream si;
    si.open("dijkstra.in");
    int n,m;
    si>>n>>m;
    int i;
    int a,b,c;
    for(i=0;i<m;++i)
    {
        si>>a>>b>>c;
        --a;
        --b;
        l[a].push_back({b,c});
        l[b].push_back({a,c});
    }
    dijkstra(n);
}