제출 #1367428

#제출 시각아이디문제언어결과실행 시간메모리
1367428JelaByteEngineerLove Polygon (BOI18_polygon)C++20
54 / 100
179 ms44100 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;
vector <vector <int>> g, rg;
vector <bool> ciklus, vis;
vector <vector <ll>> dp;
vector <int> cik;
void dfs (int st)
{
    ll sum=0, mini=LLONG_MAX;
    for (auto i: rg[st])
    {
        if (!ciklus[i])
        {
            dfs(i);
            sum+=dp[i][1];
            mini=min(mini, dp[i][0]-dp[i][1]);
        }
    }
    dp[st][0]=sum;
    dp[st][1]=1+min(sum, sum+mini);
}
void dfs1 (int st)
{
    vis[st]=true;
    cik.push_back(st);
    for (auto i: g[st])
    {
        if (ciklus[i] && !vis[i])
        {
            dfs1(i);
        }
    }
}
ll cikr (int st)
{
    int n=cik.size();
    vector <vector <ll>> dp0(n, vector <ll> (2));
    vector <vector <ll>> dp1(n, vector <ll> (2));
    dp0[0][0]=dp[st][0]; dp1[0][1]=dp[st][1];
    dp0[0][1]=INT_MAX; dp1[0][0]=INT_MAX;
    vis[st]=true;
    for (int i=1; i<n; i++)
    {
        vis[cik[i]]=true;
        dp0[i][0]=dp0[i-1][1]+dp[cik[i]][0];
        dp1[i][0]=dp1[i-1][1]+dp[cik[i]][0];
        dp0[i][1]=min(dp0[i-1][0], dp0[i-1][1])+dp[cik[i]][1];
        dp1[i][1]=min(dp1[i-1][0], dp1[i-1][1])+dp[cik[i]][1];
    }
    if (n>2) return min({dp0[n-1][1], dp1[n-1][1], dp1[n-1][0]});
    else if (n==2)
    {
        int x=cik[0], y=cik[1];
        return min(dp[x][0], dp[x][1])+min(dp[y][0], dp[y][1]);
    }
    else return dp[cik[0]][1];
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n; cin>>n;
    map <string, int> nomenklatura;
    g.resize(n); rg.resize(n);
    int cntr=0;
    for (int i=0; i<n; i++)
    {
        string s1, s2;
        cin>>s1>>s2;
        if (nomenklatura[s1]==0)
        {
            cntr++;
            nomenklatura[s1]=cntr;
        }
        if (nomenklatura[s2]==0)
        {
            cntr++;
            nomenklatura[s2]=cntr;
        }
        g[nomenklatura[s1]-1].push_back(nomenklatura[s2]-1);
        rg[nomenklatura[s2]-1].push_back(nomenklatura[s1]-1);
    }
    if (n%2!=0) cout<<-1<<endl;
    else
    {
        queue <int> kuku;
        vector <int> cnt(n);
        for (int i=0; i<n; i++)
        {
            cnt[i]=rg[i].size();
            if (rg[i].size()==0)
            {
                kuku.push(i);
            }
        }
        ciklus.assign(n, true);
        while (!kuku.empty())
        {
            int top=kuku.front();
            ciklus[top]=false;
            kuku.pop();
            for (auto i: g[top])
            {
                cnt[i]--;
                if (cnt[i]==0)
                {
                    kuku.push(i);
                }
            }
        }
        dp.resize(n, vector <ll> (2));
        for (int i=0; i<n; i++)
        {
            if (ciklus[i])
            {
                dfs(i);
            }
        }
        vis.assign(n, false);
        ll ans=0;
        for (int i=0; i<n; i++)
        {
            if (ciklus[i] && !vis[i])
            {
                cik.clear();
                dfs1(i);
                ans+=cikr(i);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…