-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathzmeu.cpp
82 lines (82 loc) · 1.83 KB
/
zmeu.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# include <cstdio>
# include <algorithm>
# include <vector>
# include <queue>
# define inf 1000000000
using namespace std;
struct elem
{
int y,val;
}E;
vector <elem> v[1005];
queue <int> q;
int i,j,n,m,p,F,minim,nr,x,y,suma,ok;
int P[10],dist[1005][10],iesire[1005],fata[1005],minn[10];
void lee (int var)
{
int i,k;
for (i=1; i<=n; ++i)
dist[i][var]=inf;
dist[fata[var]][var]=0;
q.push(fata[var]);
while (! q.empty())
{
k=q.front (); q.pop();
for (i=0; i<v[k].size(); ++i)
{
if (dist[v[k][i].y][var]>dist[k][var]+v[k][i].val)
{
dist[v[k][i].y][var]=dist[k][var]+v[k][i].val;
q.push(v[k][i].y);
}
}
}
minn[var]=inf;
for (i=1; i<=p; ++i)
minn[var]=min(minn[var], dist[iesire[i]][var]);
}
int main ()
{
freopen ("zmeu.in", "r", stdin);
freopen ("zmeu.out", "w", stdout);
scanf ("%d%d%d", &n, &m, &p);
scanf ("%d", &F);
for (i=1; i<=5; ++i)
scanf ("%d", &fata[i]);
for (i=1; i<=m; ++i)
{
scanf ("%d%d%d", &x, &y, &nr);
E.y=y; E.val=nr;
v[x].push_back(E);
E.y=x; E.val=nr;
v[y].push_back(E);
}
for (i=1; i<=p; ++i)
scanf ("%d", &iesire[i]);
for (i=1; i<=5; ++i)
lee(i);
P[1]=1; P[2]=2; P[3]=3; P[4]=4; P[5]=5;
minim=inf;
for (i=1; i<=120; ++i)
{
suma=dist[F][P[1]]; ok=0;
for (j=1; j<=4; ++j)
{
suma+=dist[fata[P[j+1]]][P[j]];
if (! dist[fata[P[j+1]]][P[j]]) ok=1;
}
if (ok)
{
next_permutation(P+1, P+5+1);
continue;
}
suma+=minn[P[5]];
if (suma<minim)
{
minim=suma;
}
next_permutation(P+1, P+5+1);
}
printf ("%d\n", minim);
return 0;
}