Pagini recente » Cod sursa (job #1987416) | Cod sursa (job #1393739) | Cod sursa (job #2043033) | Istoria paginii runda/rundeins/clasament | Cod sursa (job #1131570)
#include <fstream>
#include<iostream>
#include<windows.h>
using namespace std;
int n,m,k,b[16],c[2001][2001],s,v[1001];
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
void citire()
{
f>>n>>m;
f>>k;
for(int i=1;i<=k;i++)
f>>b[i];
int x,y,z;
for(int i=1;i<=m;i++)
{
f>>x>>y>>z;
c[x][y]=c[y][x]=z;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j&&c[i][j]==0)
c[i][j]=100000;
}
void roy_floyd()
{
for(int t=1;t<=n;t++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(c[i][t]!=100000&&c[t][j]!=100000)
if(c[i][j]>c[i][t]+c[t][j])
c[i][j]=c[i][t]+c[t][j];
}
int minim(int nod)
{
int min=100000,aux;
for(int i=1;i<=k;i++)
{
if(c[nod][b[i]]<min&&v[b[i]]==0&&nod!=b[i])
{
min=c[b[i]][nod];
aux=b[i];
}}
return aux;
}
int verif(int k)
{
for(int i=1;i<=k;i++)
if (v[b[i]]==0)
return 0;
return 1;
}
int parcurgere()
{
int na,np=1;
v[1]=1;
na=minim(np);
while(!verif(k))
{
s+=c[np][na];
np=na;
na=minim(np);
if(na==np)
s+=c[na][n];
v[np]=1;
}
return s;
}
void afisare()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<c[i][j]<<" ";
cout<<'\n';}
}
int main()
{citire();
roy_floyd();
//afisare();
parcurgere();
g<<s;
}