Submission #1347242

#TimeUsernameProblemLanguageResultExecution timeMemory
1347242ender_shayanLOSTIKS (INOI20_lostiks)C++20
23 / 100
2098 ms164504 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double	ld;
typedef pair<int, int>	pii  ;
typedef pair<ll, ll>	pll  ;
typedef vector<pii>     vii  ;
typedef vector<int>     veci ;
typedef vector<pll>     vll  ;
typedef vector<ll>      vecll;

// find_by_order             order_of_key

#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define F		        first
#define S		        second
#define pb		        push_back
#define endl            '\n'
#define Mp		        make_pair
#define all(x)          x.begin(), x.end()
#define debug(x)        cerr << #x << " = " << x << endl
#define set_dec(x)	    cout << fixed << setprecision(x);
#define fast_io         ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io         freopen("in.txt" , "r" , stdin) ; freopen("out.txt" , "w" , stdout);
#define lb              lower_bound
#define ub              upper_bound
#define for1(n)         for(int i=1;i<=n;i++)
#define for0(n)         for(int i=0;i<n;i++)
#define forn(n)         for(int i=n;i>0;i--)
#define pq              priority_queue <pii, vector<pii>, greater<pii>>
ll inf=1e18;
const int N=1e6+3,L=20;
int n,m,k,q,par[N][L],h[N],val[N],s,t,nn;
vector<pii>g[N];
vector<pii>vec;
ll dp[1<<20][20];

void dfs(int v){
    for(auto[u,w]:g[v])if(u!=par[v][0]){
        if(w!=0){val[u]|=(1<<vec.size());vec.pb({v,w});}
        h[u]=h[v]+1;
        val[u]|=val[v];
        par[u][0]=v;
        dfs(u);
    }
}
int LCA(int v1,int v2){
    if(h[v1]<h[v2])swap(v1,v2);
    int x=h[v1]-h[v2];
    for(int j=0;j<L;j++)if(x>>j&1)v1=par[v1][j];
    if(v1==v2)return v1;
    for(int j=L-1;j>=0;j--)if(par[v1][j]!=par[v2][j]){
        v1=par[v1][j];
        v2=par[v2][j];
    }
    return par[v1][0];
}
pii Move(int v1,int j){
    int v2=vec[j].S,v3=vec[j].F;
    int v4=LCA(v1,v2);
    int v5=LCA(v2,v3);
    int sum=h[v1]+h[v2]-h[v4]*2+h[v2]+h[v3]-h[v5]*2;
    int o=(val[v1]^val[v2])|(val[v2]^val[v3]);
    return {sum,o};
}
int main(){
    fast_io
    cin>>n>>s>>t;
    for1(n-1){
        int u,v,w;cin>>u>>v>>w;
        g[u].pb({v,w});
        g[v].pb({u,w});
    }
    dfs(s);
    if(val[t]==0)return cout<<h[t]<<endl,0;
    for(int j=1;j<L;j++)for1(n)par[i][j]=par[par[i][j-1]][j-1];
    nn=vec.size();

    for(int msk=1;msk<(1<<nn);msk++)for(int j=0;j<nn;j++)dp[msk][j]=inf;

    for(int j=0;j<nn;j++){
        pii p=Move(s,j);
        if(p.S==0)dp[(1<<j)][j]=p.F;
    }

    ll ans=inf;

    for(int msk=1;msk<(1<<nn);msk++){
        for(int j=0;j<nn;j++)if(dp[msk][j]!=inf){
            int v1=vec[j].F;
            for(int k=0;k<nn;k++)if((msk>>k&1)==0){
                pii p=Move(v1,k);
                if((p.S|msk)==msk)
                    dp[msk|(1<<k)][k]=min(dp[msk|(1<<k)][k],dp[msk][j]+p.F);
            }
            int v2=t;
            int v3=LCA(v1,v2);
            int o=val[v1]^val[v2];
            int sum=h[v1]+h[v2]-h[v3]*2;
            if((msk|o)==msk)
                ans=min(ans,dp[msk][j]+sum);
        }
    }
    cout<<(ans==inf ? -1:ans)<<endl;


}



#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...