Pagini recente » Cod sursa (job #833342) | Cod sursa (job #1048796) | Cod sursa (job #3040214) | Cod sursa (job #91568) | Cod sursa (job #3193143)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define N 2005
#define pinf 66e+10
using namespace std;
long long D[N][33000];
struct Nod
{
int nod,s;
long long cost;
};
class Compar //vezi priority_queue.pdf
{
public:
bool operator()( Nod x, Nod y)
{
if(x.cost>y.cost) return true; // ordine crscatoare
else return false;
}
};
priority_queue< Nod, vector< Nod >, Compar > coada;
int n,m,nrs;
vector < vector<pair<int,int> > >L(N);
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int sel[2005][2];
void dijkstra(int r)
{
int i,poz,c,j,sub;
for(i=1;i<=n;i++)
for(j=0;j<=nrs;j++)
D[i][j]=pinf;
Nod x,y;
x.cost=0;x.nod=r;x.s=0;
if(sel[r][0]) //face parte din mult
{
x.s=(x.s|(1<<sel[r][1]));
}
coada.push(x);D[r][0]=0;
while(!coada.empty())
{
x=coada.top();
coada.pop();
if(D[x.nod][x.s]==x.cost) //daca poz e la distanta minima fata de sursa
{
//parcurgem lista de adiacenta a lui poz
for(i=0;i<L[x.nod].size();i++)
{
sub=x.s;
if(sel[L[x.nod][i].first][0]) //face parte din mult
{
sub=(sub|(1<<sel[L[x.nod][i].first][1]));
}
if(D[L[x.nod][i].first][sub]>D[x.nod][x.s]+L[x.nod][i].second ) //daca putem imbunatati distanta
{
D[L[x.nod][i].first][sub]=D[x.nod][x.s]+L[x.nod][i].second;
y.nod=L[x.nod][i].first;
y.cost=D[L[x.nod][i].first][sub];
y.s=sub;
coada.push(y);
//adaugam nodul si distanta imbunatatita in coada
}
}
}
}
}
int main()
{
int x,y,c,i,k;
f>>n>>m>>k;
for(i=1;i<=k;i++)
{
f>>c;
sel[c][0]=1;
sel[c][1]=i;
nrs=(nrs|(1<<i));
}
for(i=1;i<=m;i++)
{
f>>x>>y>>c;
L[x].push_back(make_pair(y,c));
}
dijkstra(1);
g<<D[n][nrs]<<" ";
f.close();
g.close();
return 0;
}