답안 #1030543

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1030543 2024-07-22T06:38:22 Z MMihalev Training (IOI07_training) C++14
0 / 100
8 ms 6236 KB
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#include<tuple>
#include<set>
#include<map>
#include<random>
#include<chrono>
#include<array>
#include<unordered_map>
using namespace std;
const int MAX_N=1e3+3;
const int MAX_M=5e3+3;
const int MASK=(1<<10);
const int LOG=10;
int calc[MAX_N][MAX_N];
int dp[MAX_N][MASK];
int idx[MAX_M];
int pointspath[MAX_M][2][2];
int cost[MAX_M];
vector<int>edges[MAX_N];
vector<int>g[MAX_N];
int par[MAX_N][LOG];
int endss[MAX_M][2];
int in[MAX_N];
int out[MAX_N];
int ver[MAX_N];
int d[MAX_N];
int T;
int n,m;
int sumedges;
void dfs(int u)
{
    in[u]=++T;
    ver[T]=u;
    int sz=0;
    for(int v:g[u])
    {
        if(v==par[u][0])continue;
        par[v][0]=u;
        d[v]=d[u]+1;
        idx[v]=sz++;
        dfs(v);
    }
    out[u]=T;
}
int lca(int u,int v)
{
    if(d[u]>d[v])swap(u,v);
    for(int j=LOG-1;j>=0;j--)
    {
        if(d[v]-(1<<j)>=d[u])
        {
            v=par[v][j];
        }
    }
    if(u==v)return u;
    for(int j=LOG-1;j>=0;j--)
    {
        if(par[v][j]!=par[u][j])
        {
            v=par[v][j];
            u=par[u][j];
        }
    }
    return par[u][0];
}
void precompute()
{
    dfs(1);

    for(int j=1;j<LOG;j++)
    {
        for(int i=1;i<=n;i++)
        {
            par[i][j]=par[par[i][j-1]][j-1];
        }
    }

    for(int i=1;i<=m;i++)
    {
        if(!cost[i])continue;

        int u=endss[i][0],v=endss[i][1];
        int LCA=lca(u,v);

        if((d[u]+d[v]-2*d[LCA])%2==1)continue;

        edges[LCA].push_back(i);

        pointspath[i][0][0]=u;
        while(u!=LCA && par[u][0]!=LCA)u=par[u][0];
        pointspath[i][0][1]=u;

        pointspath[i][1][0]=v;
        while(v!=LCA && par[v][0]!=LCA)v=par[v][0];
        pointspath[i][1][1]=v;
    }
}
void read()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v,c;
        cin>>u>>v>>c;
        sumedges+=c;
        cost[i]=c;
        if(c==0)
        {
            g[u].push_back(v);
            g[v].push_back(u);
        }
        else
        {
            endss[i][0]=u;
            endss[i][1]=v;
        }
    }
}
void DFS(int u)
{
    for(int v:g[u])
    {
        if(v==par[u][0])continue;
        DFS(v);
    }

    int sz=g[u].size()-(par[u][0]!=0);

    for(int mask=1;mask<(1<<sz);mask++)
    {
        for(int edge:edges[u])
        {
            int cur=0,nmask=mask;
            bool val=1;
            for(int f=0;f<2;f++)
            {
                if(pointspath[edge][f][1]!=u)
                {
                    if(((1<<idx[pointspath[edge][f][1]])&mask)==0)val=0;

                    nmask&= ~(1<<idx[pointspath[edge][f][1]]);
                }

                cur+=calc[pointspath[edge][f][0]][pointspath[edge][f][1]];
            }
            cur+=dp[u][nmask];

            if(val)dp[u][mask]=max(dp[u][mask],cur+cost[edge]);
        }
    }

    for(int v:g[u])
    {
        if(v==par[u][0])continue;

        for(int pos=in[v];pos<=out[v];pos++)
        {
            int vert=ver[pos];

            calc[vert][u]=calc[vert][v]+dp[u][((1<<sz)-1) & ~(1<<idx[v])];
        }
    }

    calc[u][u]=dp[u][(1<<sz)-1];
}
void solve()
{
    DFS(1);
    int ans=sumedges-dp[1][(1<<(g[1].size()))-1];
    cout<<ans<<"\n";
}
signed main ()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    read();
    precompute();
    solve();
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 604 KB Output is correct
2 Incorrect 0 ms 604 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 860 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 6236 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 604 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 604 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 860 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 1884 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 3164 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 5468 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 2652 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 5208 KB Output isn't correct
2 Halted 0 ms 0 KB -