Submission #1269797

#TimeUsernameProblemLanguageResultExecution timeMemory
1269797Jakub_WozniakTraining (IOI07_training)C++20
30 / 100
2 ms584 KiB
#include <bits/stdc++.h>
using namespace std;
#define st first
#define nd second
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef long double ld;
const int oo = (1e+9)+9;
const int base = (1<<19);
const int maxn = (1e+3)+9;
const int mod = 998244353;
struct sc
{
    int a , b;
    int c;
};
int N  ,M ;
vector <int> t[maxn];
vector <int> addi[maxn];
vector <sc> V;
vector <sc> Vreal;
ll sum = 0;
int dep[maxn];

vector <int> kol; //sciezka
ll dp[maxn]; //sciezka
int kt[maxn] ; // sciezka



void DFSdep(int v, int o)
{
    kol.push_back(v);
    dep[v] = dep[o]+1;
    for(auto p : t[v])
    {
        if(p == o)continue;;
        DFSdep(p,v);
    }

    for(auto p : addi[v])
    {
        if(V[p].b == v)continue;

        if(abs(dep[v] - dep[V[p].b])%2)
        {
            sum += V[p].c;
        }
        else
        {
            Vreal.push_back(V[p]);
        }
    }
}


int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> M;
    int a , b , c;
    for(int i = 0 ;i < M ; i++)
    {
        cin >> a >> b >> c;
        if(c == 0)
        {
            t[a].push_back(b);
            t[b].push_back(a);
        }
        else
        {
            sc temp;
            temp.a = a;
            temp.b = b;
            temp.c = c;
            addi[a].push_back(V.size());
            addi[b].push_back(V.size());
            V.push_back(temp);
        }
    }

    int S = 0;
    for(int i = 1 ; i <= N ; i++)
    {
        if(t[i].size() == 1)S = i;
    }

    dep[0] = 0;
    DFSdep(S,0);
    V = Vreal;



    for(int i = 1; i <= N ; i++)addi[i].clear();

    for(int i = 0; i < V.size() ; i++)
    {
        if(dep[V[i].a] > dep[V[i].b])swap(V[i].a , V[i].b);
        addi[V[i].b].push_back(i);
        sum += V[i].c;
    }

    for(int i = 0; i < kol.size() ; i++)
    {
        kt[kol[i]] = i;
    }

    dp[0] = 0;
    for(int i = 1; i < kol.size() ; i++)
    {
        dp[i] = dp[i-1];
        for(auto p : addi[kol[i]])
        {
            dp[i] = max(dp[i] , (dp[kt[V[p].a]] + V[p].c));
        }
    }

    cout << sum - dp[N-1] << '\n';


    
    return 0;
}
#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...