Cod sursa(job #821301)

Utilizator deea101Andreea deea101 Data 22 noiembrie 2012 00:56:29
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <list>
//#include <pair>
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
int n,m,sursa,dest;
vector < pair<int,int> > vecini[50000]; int dist[50000];
list <int> coada;
list <int>::iterator it;
void adaugare(int x)
{
    it=coada.begin(); it++;
    for(;it!=coada.end();it++)
    {

       if(dist[*it]>dist[x]) {coada.insert(it,x); break;}
    }
    if(it==coada.end()) coada.push_back(x);

}
void schimbare(int x)
{
    coada.remove(x);
    adaugare(x);
}
void dijkstra()
{
    while(!coada.empty())
    {
        int i,x; x=coada.front();
        if(x==dest) {break;}
        for(i=0;i<vecini[x].size();i++)
        {
            if(vecini[x][i].second+dist[x]<dist[vecini[x][i].first])
            {
                dist[vecini[x][i].first]=vecini[x][i].second+dist[x];
                schimbare(vecini[x][i].first);
            }
            if(! dist[vecini[x][i].first] && vecini[x][i].first!=sursa)
            {
                dist[vecini[x][i].first]=vecini[x][i].second+dist[x];
                adaugare(vecini[x][i].first);
            }
        }
        coada.pop_front();
    }
}
int main()
{
    f>>n>>m;
    int i,x,y,l,j;
    for(i=0;i<m;i++)
    {
        f>>x>>y>>l;
        vecini[x].push_back(make_pair(y,l));
        vecini[y].push_back(make_pair(x,l));
    }
    sursa=1;
    for(i=2;i<=n;i++)
    {
        dest=i;
    //f>>sursa>>dest;
    coada.erase(coada.begin(),coada.end());
    for(j=1;j<=n;j++) dist[j]=0;
    coada.push_back(sursa);
    dist[sursa]=0;
    dijkstra();
    g<<dist[dest]<<' ';}
}