Pagini recente » Cod sursa (job #1336551) | Cod sursa (job #1942595) | Cod sursa (job #620231) | Cod sursa (job #1591437) | Cod sursa (job #1037525)
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
struct pe{
int a,b;
pe() {
a=b=0;
}
pe(int _a,int _b) {
a=_a;
b=_b;
}
};
class cmp {
public:
inline bool operator () (const pe &a,const pe &b) {
return a.b>b.b;
}
};
const int MAX_N=2100;
const int INF=(1<<30);
const int MAX_K=15;
int n;
vector<pe> A[MAX_N];
int d[20][MAX_N];
int viz[MAX_N];
vector<int> K;
priority_queue<pe,vector<pe>,cmp> Q;
void dijkstra(int start,int d[MAX_N]) {
for(int i=1;i<=n;i++) {
d[i]=INF;
viz[i]=0;
}
Q.push(pe(start,0));
d[start]=0;
while(!Q.empty()) {
int nod=Q.top().a;
int cost=Q.top().b;
if(!viz[nod]) {
for(vector<pe>::iterator it=A[nod].begin(); it!=A[nod].end(); it++) {
if(!viz[it->a]) {
if(d[it->a]>cost+it->b) {
d[it->a]=cost+it->b;
Q.push(pe(it->a,d[it->a]));
}
}
}
}
viz[nod]=1;
Q.pop();
}
}
int dp[MAX_K+3][(1<<MAX_K)+500];
int dinamic(int k) {
for(int i=0;i<k;i++) {
for(int j=0;j<(1<<k);j++) {
dp[i][j]=INF;
}
}
for(int i=0;i<k;i++) {
dp[i][(1<<i)]=d[0][K[i+1]];
}
for(int j=1;j<(1<<k);j++) {
for(int i=0;i<k;i++) {
if(j&(1<<i)) {
for(int b=0;b<k;b++) {
if(!(j&(1<<b))) {
dp[b][j^(1<<b)]=min(dp[b+1][j^(1<<b)],dp[i][j]+d[i+1][K[b+1]]);
}
}
}
}
}
int ans=INF;
for(int i=0;i<k;i++) {
ans=min(ans,dp[i][(1<<k)-1]+d[i+1][n]);
}
return ans;
}
int main() {
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
int m;
scanf("%d%d",&n,&m);
K.push_back(1);
int k;
scanf("%d",&k);
for(int i=1;i<=k;i++) {
int a;
scanf("%d",&a);
K.push_back(a);
}
for(int i=1;i<=m;i++) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
A[a].push_back(pe(b,c));
A[b].push_back(pe(a,c));
}
for(int i=0;i<=k;i++) {
dijkstra(K[i],d[i]);
}
printf("%d",dinamic(k));
return 0;
}