Pagini recente » Cod sursa (job #73266) | Cod sursa (job #115206) | Cod sursa (job #2169924) | Cod sursa (job #1366827) | Cod sursa (job #1546788)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define nmax 2005
#define Inf ((1<<31)-1)
using namespace std;
vector<bool> inQueue;
vector< pair<int,int > >v[nmax];
vector<vector<int> > m;
vector<int> kn;
int n,nrmuchii,k;
int mp[16][(1<<15)];
void citire()
{
int a,b,c;
scanf("%d %d\n%d",&n,&nrmuchii,&k);
for(int i=1; i<=k; i++)
{
scanf("%d",&c);
kn.push_back(c);
}
for(int i=1; i<= nrmuchii; i++)
{
scanf("%d %d %d",&a,&b,&c);
v[a].push_back(make_pair(b,c));//in v[a] adaug vecinul b cu costul muchiei (ab) =c;
}
}
void bellmanFord(int first)
{
m.push_back(*(new vector<int>()));
m.back().assign(n+1,Inf);
queue<int> C;
int p;
inQueue.assign(n+1,0);//marcheaza daca nodul a intrat deja in coada
m.back()[first] = 0;
C.push(first);
inQueue[first]=true;
while(!C.empty())
{
p=C.front();
C.pop();
inQueue[p]=false;
for(int i=0; i<v[p].size(); i++)//pentru toti vecinii lui p
{
int vecin=v[p][i].first;
int cost=v[p][i].second;
if(m.back()[p]+cost < m.back()[vecin])//daca distanta prin nodul p este mai mica
{
m.back()[vecin]=m.back()[p]+cost;
if( !inQueue[vecin])//daca vecinul nu a intrat in coada
{
C.push(vecin);//se adauga
inQueue[vecin]=true;//se marcheaza adaugarea
}
}
}
}
}
int optimize(int last, int sequence);
int main()
{
freopen("ubuntzei.in","rt",stdin);
freopen("ubuntzei.out","wt",stdout);
citire();
bellmanFord(1);
for(int i=0; i<k; i++)
bellmanFord(kn[i]);
kn.push_back(n);
for(int i=0;i<=k;i++)
for(int j=0;j<(1<<k);j++)
mp[i][j]=Inf;
cout<< optimize(kn.size()-1,(1<<k)-1);
return 0;
}
int optimize(int last, int sequence)
{
if(sequence==0)
return m[0][kn[last]];
if(mp[last][sequence]<Inf)
return mp[last][sequence];
for(int i=0; i<k; i++)
{
int rez=Inf;
if((sequence>>i) & 1 )
rez=optimize(i,sequence-(1<<i)) + m[i][kn[last]];
if(rez<mp[last][sequence])
mp[last][sequence]=rez;
}
return mp[last][sequence];
}