Pagini recente » Cod sursa (job #2163200) | Cod sursa (job #3142393) | Cod sursa (job #2060243) | Cod sursa (job #1313602) | Cod sursa (job #641262)
Cod sursa(job #641262)
#include <iostream>
#include<fstream>
#define NMAX 2000
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n, m, INFINIT=100001, C[NMAX][NMAX], K, v[NMAX];
void citeste()
{ int x, y, z;
in>>n>>m;
in>>K;
for (int i=1; i<=K; ++i)
in>>v[i];
for (int i=1; i<=m; ++i)
{
in>>x>>y>>z;
C[x][y]=C[y][x]=z;
}
}
void dijkstra(int x0)
{
int i, j, minim, k, ok;
int viz[NMAX], d[NMAX], tata[NMAX];
for (i = 1; i<=n; i++) {
d[i] = C[x0][i];
tata[i] = x0;
viz[i] = 0;
}
tata[x0] = 0;
viz[x0] = 1; ok = 1;
while (ok) {
minim = INFINIT;
for (i = 1; i<=n; i++)
if (!viz[i] && minim>d[i]) {
minim = d[i];
k = i;
}
if (minim != INFINIT) {
viz[k] = 1;
for (i = 1; i<=n; i++)
if (!viz[i] && d[i]>d[k]+C[k][i]) {
d[i] = d[k]+C[k][i];
tata[i] = k;
}
}
else ok = 0;
}
for (int h=1; h<=n; ++h)
if (d[h] == INFINIT) cout<<"0 "; else cout<<d[h]<<" ";
cout<<'\n';
}
int dist(int x0, int y0)
{ int i, j, minim, k, ok, viz[NMAX], d[NMAX], tata[NMAX];
for (i = 1; i<=n; i++)
{
d[i] = C[x0][i];
tata[i] = x0;
viz[i] = 0;
}
tata[x0] = 0;
viz[x0] = 1; ok = 1;
while (ok)
{
minim = INFINIT;
for (i = 1; i<=n; i++)
if (!viz[i] && minim>d[i])
{
minim = d[i];
k = i;
}
if (minim != INFINIT)
{
viz[k] = 1;
for (i = 1; i<=n; i++)
if (!viz[i] && d[i]>d[k]+C[k][i])
{
d[i] = d[k]+C[k][i];
tata[i] = k;
}
}
else ok = 0;
}
return d[y0];
}
int main()
{ int Cost=0;
citeste();
for (int i=1; i<=n; ++i)
{
for (int j=1; j<=n; ++j)
if (C[i][j] == 0) C[i][j]=INFINIT;
}
if ( K == 0)
out<<dist(1,n);
if (K == 1)
out<<dist(1,v[1]) + dist(v[1],n);
if (K > 1)
{
Cost += dist(1,v[1]);
for (int i=1; i<K; ++i)
Cost += dist(v[i], v[i+1]);
Cost += dist(v[K], n);
out<<Cost;
}
return 0;
}