Pagini recente » Cod sursa (job #2220338) | Cod sursa (job #149762) | Borderou de evaluare (job #435087) | Cod sursa (job #990646) | Cod sursa (job #1111858)
#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';
}
}