Pagini recente » Cod sursa (job #1083196) | Cod sursa (job #1663005) | Cod sursa (job #660469) | Cod sursa (job #1575516) | Cod sursa (job #2030271)
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
#define lgmax 2000000001
using namespace std;
ifstream fi ("ubuntzei.in");
ofstream fo ("ubuntzei.out");
int nroras,nrdrum,kcheie,mini,sol;
int localitate[17],distanta[2005],drummin[2005][2005],fr[2005];
struct coada{int nod,dist;};
struct cmp
{
bool operator()(coada a,coada b)
{
return (a.dist>b.dist);
}
};
priority_queue<coada,vector<coada>,cmp> pq;
bitset<2005> viz;
vector<int> drum[2005],lg[2005];
void citire()
{
int i,oras1,oras2,lungime;
fi>>nroras>>nrdrum>>kcheie;
localitate[0]=1;localitate[kcheie+1]=nroras;
for (i=1;i<=kcheie;i++) fi>>localitate[i];
for (i=1;i<=nrdrum;i++)
{
fi>>oras1>>oras2>>lungime;
drum[oras1].push_back(oras2);
drum[oras2].push_back(oras1);
lg[oras1].push_back(lungime);
lg[oras2].push_back(lungime);
}
}
void djikstra(int x)
{
int i;
coada el,el2;
el.nod=x;el.dist=0;
for (i=1;i<=nroras;i++) distanta[i]=lgmax;distanta[x]=0;
for (i=1;i<=nroras;i++) viz[i]=0;
pq.push(el);
while (!pq.empty())
{
el=pq.top();
pq.pop();
if (!viz[el.nod])
for (i=0;i<drum[el.nod].size();i++)
{
el2.nod=drum[el.nod][i];
el2.dist=el.dist+lg[el.nod][i];
if (el2.dist<distanta[el2.nod])
{
pq.push(el2);
distanta[el2.nod]=el2.dist;
}
}
viz[el.nod]=1;
}
for (i=1;i<=kcheie+1;i++) drummin[x][localitate[i]]=distanta[localitate[x]];
}
void bt(int n,int orasales)
{
int i;
if (orasales>kcheie)
{
sol=sol+drummin[orasales][nroras];
mini=min(mini,sol);
sol=sol-drummin[orasales][nroras];
}
for (i=1;i<=kcheie;i++)
if (localitate[i]!=orasales)
{
sol=sol+drummin[orasales][localitate[i]];
fr[localitate[i]]++;
bt(n+1,localitate[i]);
fr[localitate[i]]--;
sol=sol-drummin[orasales][localitate[i]];
}
}
int main()
{
citire();
for (int i=0;i<=kcheie;i++) djikstra(localitate[i]);
mini=lgmax;
bt(1,1);
fo<<mini;
return 0;
}