Cod sursa(job #1017091)

Utilizator DisturbedTeuca Sergiu Disturbed Data 27 octombrie 2013 10:45:43
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include<fstream>
#include<list>
#include<string>

using namespace std;

#define INF 1000000
#define min(a,b) ((a<b)?a:b)

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

int n,m;
int *viz,*dr;

struct lvertex
{
    int v;
    int c;
};

list<lvertex> *listd;

int getCostAt(list<lvertex> l,int v)
{
    for(list<lvertex>::iterator it=l.begin();it!=l.end();it++)
    {
        if((*it).v==v)
            return (*it).c;
    }
    return INF;
}

void citire()
{
    fin>>n>>m;   
    
    viz=new int[n+1];
    dr=new int[n+1];
    
    memset(viz,0,(n+1)*sizeof(int));
    memset(dr,0,(n+1)*sizeof(int));
    
    listd=new list<lvertex>[n+1];
    
    int x,y,c;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        lvertex k;
        k.v=y;
        k.c=c;
        listd[x].push_back(k);
        k.v=x;
        listd[y].push_back(k);
    }
    
    for(int i=1;i<=n;i++) dr[i]=INF;
    
    fin.close();
}

void rezolva()
{
    viz[1]=1;
    for(list<lvertex>::iterator it=listd[1].begin();it!=listd[1].end();it++)
    {
        dr[(*it).v]=(*it).c;
    }
    
    int ok=1,drmin;
    while(ok)
    {
        drmin=INF;
        int poz=-1;
        for(int i=1;i<=n;i++)
            if(drmin>dr[i] && !viz[i])
            { 
                drmin=dr[i]; 
                poz=i;
            }
        if(drmin==INF) 
            ok=0;
        else
        {
            viz[poz]=1;
            for(int i=1;i<=n;i++){
                int temp=getCostAt(listd[poz],i);
                if(!viz[i] && temp!=INF)
                {
                    int aux=dr[poz]+temp;
                    if(dr[i]>aux)
					{
                        dr[i]=aux;
                    }
                }
            }
        }
    }
}

void afiseaza()
{
	for (int i = 2; i <=n; ++i)
		fout<<dr[i]<<" ";
    fout.close();
}

int main()
{
    citire();
    rezolva();
    afiseaza(); 
}