Pagini recente » Cod sursa (job #550385) | Cod sursa (job #1558608) | Cod sursa (job #2119473) | Cod sursa (job #1195522) | Cod sursa (job #2453101)
#include <iostream>
#include <fstream>
#include <functional>
#include <vector>
#include <queue>
using namespace std;
ifstream intrare("ubuntzei.in");
ofstream iesire("ubuntzei.out");
const int NMAX=2005;
priority_queue < int, vector < int >, greater< int > >c;
vector < pair <int, int > >graf[NMAX];
int vizitat[NMAX],i,j,n,m,k;
int frd[NMAX];
const int KMAX=18;
int dp[1<<KMAX][KMAX];
int mindist[KMAX][KMAX];
const int inf=(1<<30);
int dist[NMAX];
void dijkstra(int x)
{
for(i=1; i<=n; i++)
{
vizitat[i]=false;
dist[i]=inf;
}
vizitat[x]=true;
dist[x]=0;
c.push(x);
while(!c.empty())
{
int nod=c.top();
c.pop();
vizitat[nod]=false;
for(size_t i=0; i<graf[nod].size(); i++)
{
int vecin=graf[nod][i].first;
int cost=graf[nod][i].second;
int costnou=dist[nod]+cost;
if(costnou<dist[vecin])
{
dist[vecin]=costnou;
if(!vizitat[vecin])
{
vizitat[vecin]=true;
c.push(vecin);
}
}
}
}
}
int TSP(int masca,int poz){
if(masca==(1<<k)-1)
return 0;
if(dp[masca][poz]!=inf)
return dp[masca][poz];
int minim=inf;
for(int i=0;i<=k-1;i++){
if((masca&(1<<i))==0){
int newans=mindist[poz][i]+TSP(masca|(1<<i),i);
if(newans<minim)
minim=newans;
}
}
return dp[masca][poz]=minim;
}
int main()
{
intrare>>n>>m>>k;
for(i=1; i<=k; i++)
intrare>>frd[i];
for(i=1; i<=m; i++)
{
int a,b,c;
intrare>>a>>b>>c;
graf[a].push_back(make_pair(b,c));
graf[b].push_back(make_pair(a,c));
}
if(k!=0)
{
frd[0]=1;
frd[k+1]=n;
k+=2;
for(int i=0; i<=k; i++)
{
dijkstra(frd[i]);
for(j=i+1; j<=k; j++)
if(i!=j)
{
mindist[i][j]=mindist[j][i]=dist[frd[j]];
}
}
for(i=0; i<=(1<<k)-1; i++)
for(j=0; j<=k; j++)
dp[i][j]=inf;
/*
dp[1][0]=0;
for(int masca=1; masca<(1<<k); masca+=2)
for(i=0; i<k; i++)
{
if(masca&(1<<i))
for(int z=0; z<k; z++)
if(i!=z && (masca&(1<<z)))
{
dp[masca][i]=min(dp[masca][i],dp[masca^(1<<i)][z]+mindist[frd[i]][frd[z]]);
}
}
iesire<<dp[(1<<k)-1][k-1];
*/
iesire<<TSP(1,0);
}
else
{
dijkstra(1);
iesire<<dist[n];
}
}