Cod sursa(job #1113601)

Utilizator denis_tdrdenis tdr denis_tdr Data 20 februarie 2014 19:05:42
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#define inf 999999
using namespace std;
struct tdr{
    int dest, cost;
    tdr(){};
    tdr(int a, int b){dest=a, cost=b;};
};
int n, m;
vector< list<tdr> > v;
list<tdr>::iterator it;
vector<int> l;
vector<int> tata;
vector<bool> viz;
void citire(){
    ifstream f("dijkstra.in");
    f>>n>>m;
    //c=vector<vector<int> >(n+1, vector<int>(n+1, inf));
    v=vector<list<tdr> >(n+1);


    int x,y,z;
    for(int i=0;i<m;i++){
        f>>x>>y>>z;
        v[x].push_back(tdr(y, z));
        v[y].push_back(tdr(x, z));
    }
    f.close();

    return;
    for(int i=1;i<n;i++){
        cout<<i<<": ";
        for(it=v[i].begin(); it!=v[i].end();it++)
            cout<<it->dest<<" ";
        cout<<"\n";
    }

}
void dijkstra(int x0){
    int minim, k, ok;

    viz=vector<bool>(n+1, false);
    l=vector<int>(n+1, inf);
    tata=vector<int>(n+1, -1);

    l[x0]=0;
    ok=1;
    k=-1;
    while(ok){
        minim=inf;
        for(int i=1;i<=n;i++)
            if(!viz[i] && l[i]<minim)
                minim=l[i], k=i;
        if(minim != inf){
            viz[k]=true;
            for(it=v[k].begin(); it!=v[k].end();it++)
                if(!viz[it->dest] && l[it->dest]>l[k]+it->cost)
                    l[it->dest]=l[k]+it->cost, tata[it->dest]=k;
        }
        else ok=0;
    }
}
int main()
{
    citire();
    dijkstra(1);
    ofstream g("dijkstra.out");
    for(int i=2;i<=n;i++)
        g<<(l[i]!=inf?l[i]:0)<<" ";
    g.close();
    return 0;
}