Pagini recente » Cod sursa (job #311119) | Cod sursa (job #889477) | Cod sursa (job #901918) | Cod sursa (job #1230522) | Cod sursa (job #1982302)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in ("ubuntzei.in");
ofstream out ("ubuntzei.out");
int const kmax = 15;
int const nmax = 2000;
int const inf = 1000000000;
int n ,m ,k;
int w[5 + kmax];
struct muchie{
int x;
int y;
int cost;
};
vector <muchie> edge;
vector <vector <int>> v;
int cost[5 + kmax][5 + kmax];
int d[5 + nmax];
queue <int> q;
void computepaths(int node){
q.push(node);
for(int i = 0 ; i <= nmax ;i++){
d[i] = inf;
}
d[node] = 0;
while(0 < q.size()){
node = q.front();
q.pop();
for(int i = 1 ; i < v[node].size() ;i++){
if(d[node] + edge[v[node][i]].cost < d[edge[v[node][i]].x + edge[v[node][i]].y - node]){
d[edge[v[node][i]].x + edge[v[node][i]].y - node] = d[node] + edge[v[node][i]].cost;
q.push(edge[v[node][i]].x + edge[v[node][i]].y - node);
}
}
}
}
int const ultimatestate = (1<<(kmax + 1));
int dp[ultimatestate][5 + kmax];
int main()
{
in>>n>>m;
in>>k;
w[0] = 1;
for(int i = 1 ; i <= k ;i++){
in>>w[i];
}
vector <int> temp;
temp.push_back(0);
for(int i = 0 ; i <= n ;i++){
v.push_back(temp);
}
k++;
w[k] = n;
edge.push_back({0 ,0 ,0});
int x ,y ,a;
for(int i = 1 ; i <= m ;i++){
in>>x>>y>>a;
edge.push_back({x ,y , a});
v[x].push_back(i);
v[y].push_back(i);
}
for(int i = 0 ; i <= k ;i++){
computepaths(w[i]);
for(int j = 0 ; j <= k ;j++){
cost[i][j] = d[w[j]];
}
}
int statemax = (1 << (k + 1));
for(int i = 0 ; i < statemax;i++){
for(int j = 0 ; j <= k ;j++){
dp[i][j] = inf;
}
}
dp[1][0] = 0;
for(int state = 1 ; state < statemax ;state++){
for(int i = 0 ;i <= k ;i++){
if(dp[state][i] != inf){///daca am fost in i cu starea state
for(int j = 0 ; j <= k ;j++){
if((state & (1<<j)) == 0){
dp[(state | (1<<j))][j] = min(dp[(state | (1<<j))][j] , dp[state][i] + cost[i][j]);
}
}
}
}
}
out<<dp[statemax - 1][k];
return 0;
}