Pagini recente » Cod sursa (job #2297751) | Cod sursa (job #1134233) | Cod sursa (job #1344964) | Arhiva de probleme | Cod sursa (job #890717)
Cod sursa(job #890717)
#include<iostream>
#include<fstream>
#include<cstring>
#include<algorithm>
#define NMAX 2002
#define INF 9999999
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
unsigned int n,m,Mat[NMAX][NMAX],v[10002],d[NMAX],viz[NMAX],k;
void read ()
{
in>>n>>m;
for( unsigned int i=1; i<=n; ++i )
for( unsigned int j=i+1; j<=n; ++j )
if(i!=j)
Mat[i][j]=Mat[j][i]=INF;
else
Mat[i][j]=Mat[j][i]=0;
unsigned int a,b,k,c;
in>>k;
v[0]=1;
for(unsigned int i=1; i<=k; ++i)
in>>v[i];
v[k+1]=n;
for(int i=1; i<=m; i++)
{ in>>a>>b>>c;
Mat[a][b]=Mat[b][a]=c;
}
}
int dijk(int inc , int fin)
{ unsigned int min,ok=1,z;
memset(viz,0,n);
for(unsigned int i=1; i<=fin; i++)
d[i]=Mat[inc][i];
viz[inc]=1;
while(ok)
{ min=INF;
for(int i=1; i<=fin; ++i)
if(viz[i]==0 && min>d[i])
{
min=d[i];
z=i;
}
if(min!=INF)
{
viz[z]=1;
for(unsigned int i=1; i<=fin; i++)
if(!viz[i] && d[i]>d[z]+Mat[z][i])
d[i]=d[z]+Mat[z][i];
}
else
ok=0;
}
return d[fin];
}
int main ()
{
long s=0;
read ();
for(int i=0; i<=k+1; i++)
{
s=s+dijk(v[i],v[i+1]);
}
out<<s;
in.close();
out.close();
return 0;
}