Pagini recente » Cod sursa (job #3185050) | Cod sursa (job #3179857) | Cod sursa (job #33140) | Cod sursa (job #156394) | Cod sursa (job #2925867)
///ubuntzei
#include <fstream>
#import <algorithm>
#import <vector>
#import <map>
#import <set>
#import <deque>
#import <queue>
#import <cassert>
#import <cmath>
#import <cstring>
#import <cctype>
#import <cstdlib>
#import <stack>
#import<unordered_map>
#import<ctime>
#import<chrono>
///mda atat de neinspirat sunt
struct ce
{
int x,val;
ce(){}
ce(int _x,int _val) : x(_x) , val(_val){}
bool operator ()(ce a,ce b)
{
return (this->val > b.val);
}
};
struct edge
{
int cost,to;
edge(int _to,int _cost):to(_to),cost(_cost){}
};
main()
{
using namespace std;
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
vector<vector<int>>cost(20,vector<int>(20,1e9));
int n,m;
cin>>n>>m;
///pregatire pt dinamica
map<int,int>mp;
int c;cin>>c;
mp[1]=0;
vector<int>aux(c+1);
for(int i=1;i<=c;i++)cin>>aux[i];
sort(aux.begin()+1,aux.end());
for(int i=1;i<=c;i++)
{
mp[aux[i]]=i;
}
mp[n]=c+1;
vector<vector<edge>>a(n+1);
for(int i=1;i<=m;i++)
{
int x,y,c;
cin>>x>>y>>c;
a[x].push_back(edge(y,c));
a[y].push_back(edge(x,c));
}
auto dij=[&](int start)
{
priority_queue<ce,vector<ce>,ce>q;
vector<int>val(n+1,1e9);
val[start]=0;
q.push(ce(start,0));
while(!q.empty())
{
auto acm=q.top();
q.pop();
if(val[acm.x]!=acm.val)continue;
for(auto c:a[acm.x])
{
if(val[c.to]>val[acm.x]+c.cost)
{
val[c.to]=val[acm.x]+c.cost;
q.push(ce(c.to,val[c.to]));
}
}
}
for(int i=start+1;i<=n;i++)
{
if(mp.count(i))
{
cost[mp[start]][mp[i]]=val[i];
}
}
};
for(int i=1;i<=n;i++)
{
if(mp.count(i))
{
dij(i);
}
}
c+=2;
vector<vector<int>>dp((1<<c),vector<int>(c,1e9));
dp[1][0]=0;
for(int i=3;i<(1<<c);i+=2)
{
for(int j=0;j<c;j++)
{
if(i&(1<<j))
{
for(int k=0;k<c;k++)
{
dp[i][j]=min(dp[i][j],dp[i^(1<<j)][k]+cost[min(j,k)][max(j,k)]);
}
}
}
}
cout<<dp[(1<<c)-1][c-1];
}