Submission #65137

#TimeUsernameProblemLanguageResultExecution timeMemory
65137edisonhelloTraining (IOI07_training)C++14
100 / 100
52 ms5464 KiB
#include<bits/stdc++.h>
using namespace std;

vector<int> Q;
vector<int> idx[1005];
vector<int> G[1005];
int p[1005],d[1005],dp[1005][1<<11],apx[1005],mx[1005];

void dfs1(int now,int pa,int dep){
    p[now]=pa;
    d[now]=dep;
    mx[now]=(1<<G[now].size())-1;
    for(int i=0;i<G[now].size();++i){
        if(G[now][i]==pa)continue;
        apx[G[now][i]]=i;
        dfs1(G[now][i],now,dep+1);
    }
}

void dfs2(int now,int pa){
    for(int i=0;i<G[now].size();++i){
        if(G[now][i]==pa)continue;
        dfs2(G[now][i],now);
    }
    for(int z=0;z<=mx[now];++z){
        for(int i=0;i<G[now].size();++i){
            if(G[now][i]==pa)continue;
            if(z&(1<<i))dp[now][z]+=dp[G[now][i]][mx[G[now][i]]];
        }
    }
    for(int i:idx[now]){
        int u=Q[i],v=Q[i+1],c=Q[i+2];
        if(v==now)swap(u,v);
        if(u==now){
            c+=dp[v][mx[v]];
            while(p[v]!=now){
                c+=dp[p[v]][mx[p[v]]^(1<<apx[v])];
                v=p[v];
            }
            Q[i]=u; Q[i+1]=v; Q[i+2]=c;
        }
        else{
            c+=dp[v][mx[v]]+dp[u][mx[u]];
            while(p[v]!=now){
                c+=dp[p[v]][mx[p[v]]^(1<<apx[v])];
                v=p[v];
            }
            while(p[u]!=now){
                c+=dp[p[u]][mx[p[u]]^(1<<apx[u])];
                u=p[u];
            }
            Q[i]=u; Q[i+1]=v; Q[i+2]=c;
        }
    }
    for(int z=0;z<=mx[now];++z){
        for(int i:idx[now]){
            int u=Q[i],v=Q[i+1],c=Q[i+2];
            // cout<<"(u,v,c): "<<u<<" "<<v<<" "<<c<<endl;
            if(u==now){
                if(z&(1<<apx[v]))dp[now][z]=max(dp[now][z],dp[now][z^(1<<apx[v])]+c);
            }
            else{
                if((z&(1<<apx[v]))&&(z&(1<<apx[u])))dp[now][z]=max(dp[now][z],dp[now][z^(1<<apx[v])^(1<<apx[u])]+c);
            }
        }
        // cout<<"dp["<<now<<"]["<<z<<"]: "<<dp[now][z]<<endl;
    }
}

int main(){
    int n,m; cin>>n>>m;
    int tot=0;
    while(m--){
        int u,v,c; cin>>u>>v>>c;
        tot+=c;
        if(!c){
            G[u].push_back(v);
            G[v].push_back(u);
        }
        else{
            Q.push_back(u);
            Q.push_back(v);
            Q.push_back(c);
        }
    }
    dfs1(1,0,1);
    for(int i=0;i<Q.size();i+=3){
        int u=Q[i],v=Q[i+1];
        while(d[u]>d[v])u=p[u];
        while(d[u]<d[v])v=p[v];
        while(u!=v)u=p[u],v=p[v];
        if((d[Q[i]]+d[Q[i+1]]-2*d[u])&1)continue;
        idx[u].push_back(i);
    }
    dfs2(1,0);
    cout<<tot-dp[1][mx[1]]<<endl;
}

Compilation message (stderr)

training.cpp: In function 'void dfs1(int, int, int)':
training.cpp:13:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<G[now].size();++i){
                 ~^~~~~~~~~~~~~~
training.cpp: In function 'void dfs2(int, int)':
training.cpp:21:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<G[now].size();++i){
                 ~^~~~~~~~~~~~~~
training.cpp:26:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0;i<G[now].size();++i){
                     ~^~~~~~~~~~~~~~
training.cpp: In function 'int main()':
training.cpp:87:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<Q.size();i+=3){
                 ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...