#include <bits/stdc++.h>
using namespace std;
struct Node
{
int w,v,o;
bool operator <(const Node &B)const
{
return w<B.w;
}
};
const int s=31630;
vector<pair<int,int>>D[109],T[109];
int tab[109];
bool dp1[109][s+1];
int dp2[109][s+1];
vector<pair<int,int>>Opcje[109];
int main()
{ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int N;
cin>>N;
for(int I=1;I<=N;I++)
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>tab[i];
D[i].clear();
T[i].clear();
for(int j=1;j<=s;j++)
{
dp1[i][j]=0;
dp2[i][j]=-1;
Opcje[i].clear();
}
}
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
D[a].push_back({b,c});
T[b].push_back({a,c});
}
deque<pair<int,int>>Y;
dp1[1][1]=1;
Y.push_back({1,1});
while(!Y.empty())
{
int v;
long long o;
v=Y.front().first;
o=Y.front().second;
Y.pop_front();
for(auto[som,o2] : D[v])
{
long long u=o*o2;
if(u>s){continue;}
if(u>tab[som]||dp1[som][u]){continue;}
dp1[som][u]=1;
Y.push_back({som,u});
}
}
Y.clear();
dp2[n][1]=tab[n];
priority_queue<Node>Q;
Q.push({tab[n],n,1});
while(!Q.empty())
{
Node xd=Q.top();
Q.pop();
int w=xd.w;
int v=xd.v;
long long o=xd.o;
if(dp2[v][o]!=w){continue;}
for(auto[som,o2] : T[v])
{
long long u=o*o2;
if(u>s){continue;}
long long prop=min(dp2[v][o]/o2,tab[som]);
if(prop>dp2[som][u])
{
dp2[som][u]=prop;
Q.push({prop,som,u});
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=s;j>=1;j--)
{
if(dp2[i][j]<=0){continue;}
if(Opcje[i].size()==0||dp2[i][j]>Opcje[i].back().first)
{
Opcje[i].push_back({dp2[i][j],j});
}
}
}
long long wyn=-1;
for(int i=1;i<=n;i++)
{
for(auto[som,o2] : D[i])
{
for(int j=1;j<=s;j++)
{
if(dp1[i][j]==0){continue;}
long long u=(long long)o2*j;
if(Opcje[som].size()==0||Opcje[som].back().first<u){continue;}
int l=0,p=Opcje[som].size()-1;
while(l<p)
{
const int mid=(l+p)>>1;
if(Opcje[som][mid].first>=u){p=mid;}
else{l=mid+1;}
}
wyn=max(wyn,u*Opcje[som][l].second);
}
}
}
cout<<wyn<<'\n';
}
return 0;
}
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | #include <bits/stdc++.h> using namespace std; struct Node { int w,v,o; bool operator <(const Node &B)const { return w<B.w; } }; const int s=31630; vector<pair<int,int>>D[109],T[109]; int tab[109]; bool dp1[109][s+1]; int dp2[109][s+1]; vector<pair<int,int>>Opcje[109]; int main() {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int N; cin>>N; for(int I=1;I<=N;I++) { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>tab[i]; D[i].clear(); T[i].clear(); for(int j=1;j<=s;j++) { dp1[i][j]=0; dp2[i][j]=-1; Opcje[i].clear(); } } for(int i=1;i<=m;i++) { int a,b,c; cin>>a>>b>>c; D[a].push_back({b,c}); T[b].push_back({a,c}); } deque<pair<int,int>>Y; dp1[1][1]=1; Y.push_back({1,1}); while(!Y.empty()) { int v; long long o; v=Y.front().first; o=Y.front().second; Y.pop_front(); for(auto[som,o2] : D[v]) { long long u=o*o2; if(u>s){continue;} if(u>tab[som]||dp1[som][u]){continue;} dp1[som][u]=1; Y.push_back({som,u}); } } Y.clear(); dp2[n][1]=tab[n]; priority_queue<Node>Q; Q.push({tab[n],n,1}); while(!Q.empty()) { Node xd=Q.top(); Q.pop(); int w=xd.w; int v=xd.v; long long o=xd.o; if(dp2[v][o]!=w){continue;} for(auto[som,o2] : T[v]) { long long u=o*o2; if(u>s){continue;} long long prop=min(dp2[v][o]/o2,tab[som]); if(prop>dp2[som][u]) { dp2[som][u]=prop; Q.push({prop,som,u}); } } } for(int i=1;i<=n;i++) { for(int j=s;j>=1;j--) { if(dp2[i][j]<=0){continue;} if(Opcje[i].size()==0||dp2[i][j]>Opcje[i].back().first) { Opcje[i].push_back({dp2[i][j],j}); } } } long long wyn=-1; for(int i=1;i<=n;i++) { for(auto[som,o2] : D[i]) { for(int j=1;j<=s;j++) { if(dp1[i][j]==0){continue;} long long u=(long long)o2*j; if(Opcje[som].size()==0||Opcje[som].back().first<u){continue;} int l=0,p=Opcje[som].size()-1; while(l<p) { const int mid=(l+p)>>1; if(Opcje[som][mid].first>=u){p=mid;} else{l=mid+1;} } wyn=max(wyn,u*Opcje[som][l].second); } } } cout<<wyn<<'\n'; } return 0; } |
English