Cod sursa(job #1111858)

Utilizator varga13VarGaz13 varga13 Data 19 februarie 2014 10:34:23
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <vector>
//#include <utility>
#include <set>
#define mx 2000
#define inf 100008
using namespace std;

ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

int n,m,k, Sum, Pri[mx], Sol[mx][mx];
bool pribool[mx];
vector< pair<int,int> > adiacent[mx];
set< pair<int,int> > S;
void Write(), Read();


inline void Init(int index, int s)
{
    for(int i=1;i<=n;i++)
        Sol[index][i]=inf;
    Sol[index][s]=0;
    S.insert(make_pair(s,0));
}

inline void Relax(int src, int dst, int cst, int index)
{
    if(Sol[index][src]+cst<Sol[index][dst])
    {
        Sol[index][dst]=Sol[index][src]+cst;
        S.insert(make_pair(dst,Sol[index][dst]));
    }
}

void Dijkstra(int index, int s)
{
    Init(index,s);
    int nod, cost;
    for(;S.size();)
    {
        nod=(*S.begin()).first;
        cost=(*S.begin()).second;
        S.erase(*S.begin());
        for(int i=0;i<adiacent[nod].size();++i)
        {
            Relax(nod,adiacent[nod][i].first, adiacent[nod][i].second, index);
        }
    }

}


int main()
{
    Read();
    Dijkstra(1,1);
    /*for(int i=2;i<=k+1;++i)
    {
        Dijkstra(i, Pri[i]);
    }*/
   // Write();
    g<<Sol[1][n];
    return 0;
}

void Read()
{
    f>>n>>m>>k;
    int s1,s2,cost;
    for(int i=1;i<=k;i++)
    {
        f>>Pri[i];
        pribool[Pri[i]]=1;
    }
    for(int i=0;i<m;i++)
    {
        f>>s1>>s2>>cost;
        adiacent[s1].push_back(make_pair(s2,cost));
        adiacent[s2].push_back(make_pair(s1,cost));
    }
}

void Write()
{
   for(int j=1;j<=n;++j)
        g<<Sol[1][j]<<' ';
    g<<'\n';

    for(int i=2;i<=k+1;++i)
    {
        for(int j=1;j<=n;++j)
            g<<Sol[i][j]<<' ';
        g<<'\n';
    }

}