Pagini recente » Borderou de evaluare (job #2072007) | Cod sursa (job #909782) | Cod sursa (job #2552127) | Cod sursa (job #2408530) | Cod sursa (job #3274873)
#include <bits/stdc++.h>
using namespace std;
const int N_MAX = 301;
int N, M, Q;
int R[N_MAX];
int nodes[N_MAX];
struct Edge
{
int risc, len;
inline bool operator< (const Edge& rhs) const
{
return risc < rhs.risc;
}
Edge(int _risc, int _len) :
risc(_risc), len(_len) {}
};
inline bool ReverseCmp(const Edge& a, const Edge& b)
{
return b < a;
}
vector<Edge> rd[N_MAX][N_MAX];
void SetInput(string name)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
(void)!freopen((name + ".in").c_str(), "r", stdin);
(void)!freopen((name + ".out").c_str(), "w", stdout);
}
void ReadInput()
{
cin >> N >> M >> Q;
for(int i = 1; i <= N; i++)
{
cin >> R[i];
nodes[i] = i;
}
for(int i = 0, v1, v2, len; i < M; i++)
{
cin >> v1 >> v2 >> len;
if(v1 == v2) continue;
rd[v1][v2].emplace_back(0, len);
rd[v2][v1].emplace_back(0, len);
}
}
void Solve()
{
sort(nodes + 1, nodes + N + 1, [&](int a, int b)
{
return R[a] < R[b];
});
for(int cnt = 1; cnt <= N; cnt++)
for(int i = 1, k = nodes[cnt]; i <= N; i++)
for(int j = 1; j <= N; j++)
{
if(i == j || i == k || j == k)
continue;
if(rd[i][k].empty() || rd[k][j].empty())
continue;
Edge temp = Edge(R[k], 0);
temp.len += rd[i][k].back().len;
temp.len += rd[k][j].back().len;
/// Adaugam noua muchie
if(rd[i][j].empty())
{
rd[i][j].emplace_back(temp);
continue;
}
if(rd[i][j].back().len <= temp.len) /// nu are rost sa adaugam acest drum
continue;
if(rd[i][j].back().risc == temp.risc)
rd[i][j][rd[i][j].size() - 1].len = temp.len;
else
rd[i][j].emplace_back(temp);
}
int i, j, r;
vector<Edge>::reverse_iterator it;
while(Q--)
{
cin >> i >> j >> r;
if(i == j)
{
cout << "0\n";
continue;
}
it = lower_bound(rd[i][j].rbegin(), rd[i][j].rend(), Edge(r, 0), ReverseCmp);
if(it == rd[i][j].rend())
cout << "-1\n";
else
cout << it->len << '\n';
}
}
int main()
{
SetInput("risc");
ReadInput();
Solve();
return 0;
}