제출 #1302052

#제출 시각아이디문제언어결과실행 시간메모리
1302052bronze_coderTraining (IOI07_training)C++20
0 / 100
11 ms5196 KiB
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n,m;
    cin >> n >> m;
    vector<vector<int>> adj(n);
    vector<vector<int>> edges;
    int sum = 0;
    for(int i=0;i<m;i++){
        int a,b,c;
        cin >> a >> b >> c;
        a--;
        b--;
        if(c==0){
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
        else{
            edges.push_back({a,b,c});
            sum += c;
        }
    }

    vector<int> q = {0};
    vector<int> parent(n,0);
    vector<int> dist(n,0);
    for(int index=0;index<n;index++){
        int i = q[index];
        for(int j:adj[i]){
            if(j!=parent[i]){
                parent[j] = i;
                dist[j] = dist[i]+1;
                q.push_back(j);
            }
        }
    }

    vector<vector<int>> lift(n);
    for(int i=0;i<n;i++){
        lift[i].push_back(parent[i]);
    }
    for(int j=1;j<20;j++){
        for(int i=0;i<n;i++){
            lift[i].push_back(lift[lift[i][j-1]][j-1]);
        }
    }

    vector<vector<int>> dp(n);

    for(int i=0;i<n;i++){
        for(int j=0;j<(1<<adj[i].size());j++){
            dp[i].push_back(0);
        }
    }

    vector<vector<vector<int>>> e(n);

    for(int i=0;i<edges.size();i++){
        int x = edges[i][0];
        int y = edges[i][1];
        if((dist[x]+dist[y])&1){
            continue;
        }
        if(dist[x]<dist[y]){
            swap(x,y);
        }
        for(int j=19;j>=0;j--){
            if(dist[x]-(1<<j)>dist[y]){
                x = lift[x][j];
            }
        }
        if(parent[x]!=y){
            if(dist[x]>dist[y]){
                x = parent[x];
            }
            for(int j=19;j>=0;j--){
                if(lift[x][j]!=lift[y][j]){
                    x = lift[x][j];
                    y = lift[y][j];
                }
            }
            int z = parent[x];
            e[z].push_back({i,x,y});
        }
        else{
            int z = parent[x];
            e[z].push_back({i,x});
        }
    }
    vector<vector<int>> adj1(n);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            adj1[i].push_back(-1);
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<adj[i].size();j++){
            adj1[i][adj[i][j]] = j;
        }
    }
    for(int a=n-1;a>=0;a--){
        int i = q[a];
        for(int j=0;j<(1<<adj[i].size());j++){
            for(int k=0;k<adj[i].size();k++){
                if((j&(1<<k))==0){
                    dp[i][j] += dp[adj[i][k]][0];
                }
            }
        }
        for(auto z:e[i]){
            int s = edges[z[0]][2];
            if(z.size()==3){
                int x = edges[z[0]][0];
                int y = edges[z[0]][1];
                s += dp[x][0];
                s += dp[y][0];
                while(parent[x]!=i){
                    s += dp[parent[x]][1<<adj1[parent[x]][x]];
                    x = parent[x];
                }
                while(parent[y]!=i){
                    s += dp[parent[y]][1<<adj1[parent[y]][y]];
                    y = parent[y];
                }
            }
            for(int j=0;j<(1<<adj[i].size());j++){
                int f = 1;
                int k = 0;
                if(z.size()==3){
                    if((j&(1<<adj1[i][z[2]]))){
                        f = 0;
                    }
                    k += 1<<adj1[i][z[2]];
                }
                if((j&(1<<adj1[i][z[1]]))){
                    f = 0;
                }
                k += 1<<adj1[i][z[1]];
                if(f){
                    dp[i][j] = max(dp[i][j],s+dp[i][j+k]);
                }
            }
        }
        
    }
    cout << sum-dp[0][0] << endl;
}
#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...