Cod sursa(job #1849022)

Utilizator SkiryFarauanu Ionut Skiry Data 16 ianuarie 2017 22:22:02
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
struct nod{
    int nr,val;
    nod *urm;
}*l[100];
int n,m,v,s[100],t[100],d[100];
int pinf=10000,min1;
void citire()
{
    nod *p,*q;
    fin>>n>>v;
    int i,j,k;
    while(fin>>i>>j>>k)
    {
        p=new nod;
        p->nr=j;
        p->val=k;
        p->urm=l[i];
        l[i]=p;
        q=new nod;
        q->nr=i;
        q->val=k;
        q->urm=l[j];
        l[j]=q;
    }
}
void cauta_min(int &vf)
{
    min1=pinf;
    for(int i=1;i<=n;i++)
        if(!s[i])
            if(d[i]<min1)
            {
                min1=d[i];
                vf=i;
            }
}
void imbunatatire(int vf)
{
    int val1;
    for(int i=1;i<=n;i++)
        if(!s[i])
        {
            nod *p;
            p=l[i];
            while(p&&p->nr!=vf)p=p->urm;
            if(!p)val1=pinf;
            else val1=p->val;
            if(d[i]>d[vf]+val1)
            {
                d[i]=d[vf]+val1;
                t[i]=vf;
            }
        }
}
void drum(int i)
{
    if(t[i])
        drum(t[i]);
    fout<<i<<" ";
}
void afis_vector(int ve[100])
{
    for(int i=1;i<=n;i++)
        fout<<ve[i]<<" ";
    fout<<endl;
}
int main()
{
    citire();
    int vf,val1;
    nod *p;
    for(int i=1;i<=n;i++)
        if(i!=v)
        {
            p=l[i];
            while(p&&p->nr!=vf)p=p->urm;
            if(!p)val1=pinf;
            else val1=p->val;
            d[i]=val1;
            if(val1!=pinf)
                t[i]=v;
        }
    for(int k=1;k<=n-1;k++)
    {
        cauta_min(vf);
        s[vf]=1;
        imbunatatire(vf);
    }
    /*fout<<"Drum ";afis_vector(d);
    fout<<"Noduri vizitate ";afis_vector(s);
    fout<<"Tati ";afis_vector(t);*/
    drum(3);
    return 0;
}