Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimzize("Ofast,no-stack-protector")
- #include<bits/stdc++.h>
- #define int long long
- #define quick ios::sync_with_stdio(0);cin.tie(0);
- #define rep(x,a,b) for(int x=a;x<=b;x++)
- #define repd(x,a,b) for(int x=a;x>=b;x--)
- #define lowbit(x) (x&-x)
- #define sz(x) (int)(x.size())
- #define F first
- #define S second
- #define all(x) x.begin(),x.end()
- #define mp make_pair
- #define eb emplace_back
- using namespace std;
- typedef pair<int,int> pii;
- void debug(){
- cout<<"\n";
- }
- template <class T,class ... U >
- void debug(T a, U ... b){
- cout<<a<<" ",debug(b...);
- }
- const int N=1e6+7;
- const int INF=1e18;
- int n,m,q,k;
- vector<int> order;
- bool vis[N];
- int scc[N];
- vector<int> v[N];
- vector<int> v2[N];
- int num=0;
- int L[N];
- int val[N];
- int L2[N];
- int d2[N];
- vector<int> v3[N];
- void Revdfs(int x){
- vis[x]=true;
- for(int i:v2[x]){
- if(!vis[i]){
- Revdfs(i);
- }
- }
- order.eb(x);
- }
- void dfs(int x){
- scc[x]=num;
- L[num]+=val[x];
- for(int i:v[x]){
- if(!scc[i]){
- dfs(i);
- }
- }
- }
- void Kosaraju(){
- num=0;
- order.clear();
- rep(i,1,n) vis[i]=false,L[i]=L2[i]=0,scc[i]=0,d2[i]=0;
- rep(i,1,n){
- if(!vis[i])Revdfs(i);
- }
- reverse(all(order));
- for(int i:order){
- if(!scc[i]) ++num,dfs(i);
- }
- rep(i,1,n){
- for(int j:v[i]){
- if(scc[j]!=scc[i]){
- v3[scc[j]].eb(scc[i]);
- d2[scc[i]]++;
- }
- }
- }
- //assert(num<=n);
- }
- struct edge{
- int f,to,k;
- }e[N];
- int a[N];
- int x[N];
- bool ok(int K){
- int ans=0;
- /*fill(v,v+n+1,vector<int>());
- fill(v2,v2+n+1,vector<int>());
- fill(v3,v3+n+1,vector<int>());*/
- rep(i,1,n) v[i].clear(),v2[i].clear(),v3[i].clear();
- rep(i,1,m){
- if(e[i].k<=K){
- v[e[i].f].eb(e[i].to);
- v2[e[i].to].eb(e[i].f);
- }
- }
- Kosaraju();
- queue<int> Q;
- rep(i,1,num){
- L2[i]=L[i];
- if(!d2[i]) Q.push(i);
- }
- while(Q.size()){
- int x=Q.front();
- Q.pop();
- for(int i:v3[x]){
- L2[i]=max(L2[i],L[i]+L2[x]);
- d2[i]--;
- if(!d2[i]) Q.push(i);
- }
- }
- rep(i,1,n) ans+=L2[scc[i]];
- return ans>=q;
- }
- signed main(){
- quick
- cin>>n>>m>>k>>q;
- int Kmax=0;
- rep(i,1,k) cin>>a[i];
- rep(i,1,k) cin>>x[i];
- rep(i,1,m){
- cin>>e[i].f>>e[i].to>>e[i].k;
- Kmax=max(Kmax,e[i].k);
- }
- rep(i,1,k){
- val[a[i]]=x[i];
- }
- if(ok(0)) cout<<0<<"\n";
- else if(!ok(Kmax)) cout<<"-1"<<"\n";
- else{
- int l=0;
- int r=Kmax;
- while(l+1<r){
- int middle=(l+r)>>1;
- if(ok(middle)) r=middle;
- else l=middle;
- }
- cout<<r<<"\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement