Submission #570487

#TimeUsernameProblemLanguageResultExecution timeMemory
570487groshiBeads and wires (APIO14_beads)C++17
100 / 100
183 ms32608 KiB
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define int long long
int inf=1e9;
struct wi{
    vector<int> Q;
    long long dp[4]={0,0,0,0};///0->srodek i zost, 1->srodek i gora, 2->pocz, 3-> kon
    long long do_ojca=0;
}*w;
void dfs(int x,int ojc)
{
    if(w[x].Q.size()==2 && ojc!=0)
        return;
    long long a=-inf,b=-inf,c=-inf,d=-inf,e=-inf;
    int gdzie1,gdzie2,skad1,skad2;
    long long suma=0;
    for(int i=0;i<w[x].Q.size();i+=2)
    {
        int pom=w[x].Q[i];
        int koszt=w[x].Q[i+1];
        if(pom==ojc)
            continue;
        w[pom].do_ojca=koszt;
        dfs(pom,x);
        long long teraz=max(w[pom].dp[0],w[pom].dp[2]);
        suma+=teraz;
        long long srodek=max(w[pom].dp[1],w[pom].dp[3])-teraz;
        if(srodek>e)
            e=srodek;
        long long bez=w[pom].dp[1]+koszt-teraz;
        if(bez>a)
        {
            gdzie2=gdzie1;
            b=a;
            gdzie1=pom;
            a=bez;
        }
        else if(bez>b)
        {
            gdzie2=pom;
            b=bez;
        }
        long long bez_sr=w[pom].dp[0]+koszt-teraz;
        if(bez_sr>c)
        {
            skad2=skad1;
            d=c;
            skad1=pom;
            c=bez_sr;
        }
        else if(bez_sr>d)
        {
            skad2=pom;
            d=bez_sr;
        }
    }
    w[x].dp[0]=suma;
    w[x].dp[1]=suma+max((long long)0,e);
    w[x].dp[1]=max(w[x].dp[1],suma+c+d);
    if(gdzie1!=skad1)
        w[x].dp[1]=max(w[x].dp[1],suma+a+c);
    else{
        w[x].dp[1]=max(w[x].dp[1],suma+a+d);
        w[x].dp[1]=max(w[x].dp[1],suma+b+c);
    }
    w[x].dp[2]=suma+c+w[x].do_ojca;
    w[x].dp[3]=suma+a+w[x].do_ojca;
}
int32_t main()
{
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(0);
    int n,x,y,z;
    cin>>n;
    w=new wi[n+3];
    for(int i=1;i<n;i++)
    {
        cin>>x>>y>>z;
        w[x].Q.push_back(y);
        w[x].Q.push_back(z);
        w[y].Q.push_back(x);
        w[y].Q.push_back(z);
    }
    dfs(1,0);
    //for(int i=1;i<=n;i++)
        //cout<<i<<": "<<w[i].dp[0]<<" "<<w[i].dp[1]<<" "<<w[i].dp[2]<<" "<<w[i].dp[3]<<"\n";
    //cout<<w[1].dp[0]<<" "<<w[1].dp[1]<<" "<<w[1].dp[2]<<" "<<w[1].dp[3]<<"\n";
    cout<<max(w[1].dp[0],w[1].dp[1]);
    return 0;
}

Compilation message (stderr)

beads.cpp: In function 'void dfs(long long int, long long int)':
beads.cpp:19:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |     for(int i=0;i<w[x].Q.size();i+=2)
      |                 ~^~~~~~~~~~~~~~
beads.cpp:17:16: warning: variable 'gdzie2' set but not used [-Wunused-but-set-variable]
   17 |     int gdzie1,gdzie2,skad1,skad2;
      |                ^~~~~~
beads.cpp:17:29: warning: variable 'skad2' set but not used [-Wunused-but-set-variable]
   17 |     int gdzie1,gdzie2,skad1,skad2;
      |                             ^~~~~
beads.cpp:62:5: warning: 'skad1' may be used uninitialized in this function [-Wmaybe-uninitialized]
   62 |     if(gdzie1!=skad1)
      |     ^~
beads.cpp:62:5: warning: 'gdzie1' may be used uninitialized in this function [-Wmaybe-uninitialized]
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...