#include<bits/stdc++.h>
// #pragma GCC optimize("O3" , "unroll-loops")
// #include <ext/pb_ds/assoc_container.hpp>
using namespace std;
// using namespace __gnu_pbds;
// template <class T>
// using Tree = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define int long long
int floor_div(int x, int y) {
assert(y != 0);
if (y < 0) {
y = -y;
x = -x;
}
if (x >= 0) return x / y;
return (x + 1) / y - 1;
}
int ceil_div(int x, int y) {
assert(y != 0);
if (y < 0) {
y = -y;
x = -x;
}
if (x <= 0) return x / y;
return (x - 1) / y + 1;
}
const int N = 2000;
const int C = 3;
const int L = (1<<17);
const int INF = 1e18;
int n , m , t , l;
vector<pair<int ,int>> adj[N + 1];
int invadj[N + 1][N + 1];
vector<vector<int>> dist[N+1][N+1];
void run_case()
{
cin>>n>>m>>t>>l;
for(int i = 1 ; i <= n ;i++)
{
invadj[i][0] = 0;
adj[i].push_back({0 , 0});
}
for(int i = 0 ; i < m ;i++)
{
int u , v , c;
cin>>u>>v>>c;
invadj[u][v] = (int)adj[u].size();
adj[u].push_back({v , c});
invadj[v][u] = (int)adj[v].size();
adj[v].push_back({u , c});
}
for(int i = 1 ;i <= n ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
dist[i][j].assign((int)adj[i].size() , vector<int>((int)adj[j].size() , INF));
}
}
for(int i = 1 ; i <= n ; i++)
{
for(int j = 0 ; j < (int)adj[i].size() ; j++)
{
priority_queue<pair<int , pair<int ,int>>> pq;
dist[i][i][j][j] = 0;
pq.push({0 , {j , i}});
vector<vector<bool>> vis(m + 1 , vector<bool>(n + 1));
while(!pq.empty())
{
auto tp = pq.top();
pq.pop();
int d = -tp.first;
auto [edgprv , cur] = tp.second;
if(vis[edgprv][cur])
continue;
vis[edgprv][cur] = 1;
int prv = adj[cur][edgprv].first;
for(auto [u , c] : adj[cur])
{
if(u != prv && u)
{
int edgu = invadj[u][cur];
if(dist[i][u][j][edgu] > d + c)
{
dist[i][u][j][edgu] = d + c;
pq.push({-(d + c) , {edgu , u}});
}
}
}
}
}
}
vector<vector<int>> dp(l , vector<int>(m + 1 , INF));
vector<int> x(l);
for(auto &u : x)
cin>>u;
int p , q;
cin>>p>>q;
p--;
x[p] = q;
dp[0][0] = 0;
int ans = INF;
for(int i = 1 ; i < l ; i++)
{
int u = x[i] , v = x[i - 1];
for(int prvu = 1 ; prvu < (int) adj[u].size() ; prvu++)
{
for(int prvv = 0 ; prvv < (int)adj[v].size() ; prvv++)
{
dp[i][prvu] = min(dp[i][prvu] , dp[i - 1][prvv]+ dist[v][u][prvv][prvu]);
}
if(i == l - 1)
ans = min(ans , dp[i][prvu]);
}
}
cout<<(ans >= INF ? -1 : ans)<<'\n';
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
// cin>>t;
while(t--)
{
run_case();
}
}
// THINK OF DP !
// KEEP TRACK OF TIME !
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |