/**
* Author : Vu Khac Minh
* Created : 08.03.2024
**/
#include <bits/stdc++.h>
#define MASK(x) ((1ll) << (x))
#define BIT(x, i) (((x) >> (i)) & (1))
#define c_bit(i) __builtin_popcountll(i)
#define SET_ON(x, i) ((x) | MASK(i))
#define SET_OFF(x, i) ((x) & ~MASK(i))
#define ALL(v) (v).begin(), (v).end()
#define REP(i, n) for (int i = 0, _n = (n); i < _n; ++i)
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i)
#define FORD(i, b, a) for (int i = (b), _a = (a); i >= _a; --i)
#define db(val) "["#val" = " << (val) << "] "
#define ll long long
#define int long long
using namespace std;
const int maxn = 5e3 + 5;
const int mod = 1e9+7;
void file()
{
#define Task "ROUNDPRI"
if(fopen(Task".inp","r"))
{
freopen(Task".inp","r",stdin);
freopen(Task".out","w",stdout);
}
}
ll n,m,k,st[maxn],dp[maxn][MASK(5)],nquery,bonus[maxn];
vector<pair<int,int>> adj[maxn];
void solve()
{
cin>>n>>m>>k;
FOR(i,1,k) cin>>st[i];
FOR(i,1,m)
{
int u,v,w;
cin>>u>>v>>w;
adj[v].push_back({u,w});
}
FOR(i,0,n)
FOR(mask,0,MASK(5)-1)
dp[i][mask] = 1e15;
priority_queue<pair<int,pair<int,int>>,vector<pair<int,pair<int,int>>>,greater<pair<int,pair<int,int>>>> pq;
FOR(i,1,k)
{
pq.push({0,{st[i],0}});
dp[st[i]][0] = 0;
// cout << st[i] << endl;
}
while(pq.size())
{
ll du = pq.top().first;
ll u = pq.top().second.first;
ll mask = pq.top().second.second;
pq.pop();
if(du!=dp[u][mask]) continue;
// cout << u << ' ' << du << endl;
for(auto i : adj[u])
{
int v = i.first,w = i.second;
if(dp[v][mask] > du + w)
{
dp[v][mask] = du + w;
pq.push({dp[v][mask],{v,mask}});
// cout << v << ' ' << w << ' ' << mask << ' ' << dp[v][mask] << endl;
}
FOR(j,0,4)
{
if(!BIT(mask,j))
{
int newd = du + (w/10 * (9-j));
if(dp[v][mask|MASK(j)] > newd)
{
dp[v][mask|MASK(j)] = newd;
pq.push({dp[v][mask|MASK(j)],{v,mask|MASK(j)}});
}
}
}
}
}
/* FOR(i,0,n)
FOR(mask,0,MASK(5)-1)
{
cout<<mask<<" "<<i<<" "<<dp[i][mask]<<'\n';
}*/
cin>>nquery;
while(nquery--)
{
int s;
cin>>s;
FOR(i,0,4)
{
cin>>bonus[i];
if(bonus[i] == -1) bonus[i] = 1e15;
}
ll res = 1e15;
FOR(mask,0,MASK(5)-1)
{
ll val = dp[s][mask];
FOR(i,0,4)
if(BIT(mask,i))
val+=bonus[i];
res = min(res,val);
}
if(res == 1e15) cout<<-1<<'\n';
else cout<<res<<'\n';
}
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int ntest = 1;
file();
//cin >> ntest;
while (ntest--)
{
solve();
}
return 0;
}
Compilation message (stderr)
Main.cpp: In function 'void file()':
Main.cpp:26:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
26 | freopen(Task".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Main.cpp:27:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
27 | freopen(Task".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# | 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... |
# | 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... |