제출 #1367306

#제출 시각아이디문제언어결과실행 시간메모리
1367306JelaByteEngineerLove Polygon (BOI18_polygon)C++20
0 / 100
2095 ms36056 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;
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);
}
int cikr (int st, int n)
{
    int ciksz=1;
    vis[st]=true;
    vector <vector <ll>> dp0(n, vector <ll> (2));
    vector <vector <ll>> dp1(n, vector <ll> (2));
    dp0[st][0]=dp[st][0]; dp1[st][1]=dp[st][1];
    dp0[st][1]=INT_MAX; dp1[st][0]=INT_MAX;
    int trn=g[st].back(), preth=st;
    while (trn!=st)
    {
        ciksz++;
        vis[trn]=true;
        dp0[trn][0]=dp0[preth][1]+dp[trn][0];
        dp1[trn][0]=dp1[preth][1]+dp[trn][0];
        dp0[trn][1]=min(dp0[preth][0], dp0[preth][1])+dp[trn][1];
        dp1[trn][1]=min(dp1[preth][0], dp1[preth][1])+dp[trn][1];
        preth=trn;
        trn=g[trn].back();
    }
    if (ciksz==2) return 0;
    else return min({dp0[preth][1], dp1[preth][1], dp1[preth][0]});
}
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);
        int ans=0;
        for (int i=0; i<n; i++)
        {
            if (ciklus[i] && !vis[i])
            {
                ans+=cikr(i, n);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…