Reading

ARC078F Mole and Abandoned Mine


Fanyi Pu

้ข˜็›ฎ้“พๆŽฅ

็ป™ไธ€ไธช n(nโ‰ค15) ไธช็‚น m ๆก่พน็š„ๆ— ๅ‘่ฟž้€šๅ›พ๏ผˆไธๅญ˜ๅœจ่‡ช็Žฏๆˆ–้‡่พน๏ผ‰๏ผŒๆฏๆก่พนๆœ‰ไธ€ไธช่พนๆƒ๏ผŒ่ฆๆฑ‚ๅ‰ฒๆމ่‹ฅๅนฒๆก่พน๏ผŒไฝฟ 1 ๅˆฐ n ๅชๆœ‰ 1 ๆก่ทฏๅพ„๏ผˆไธ็ป่ฟ‡้‡ๅค็‚น๏ผ‰๏ผŒ้—ฎๅ‰ฒๆމ็š„่พนๆƒๅ’Œๆœ€ๅฐๆ˜ฏๅคšๅฐ‘ใ€‚1

้ข˜่งฃ

้—ฎ้ข˜ๅ…ถๅฎžๅฐฑๆ˜ฏ้œ€่ฆไฟ็•™็š„่พนๆƒๅ’Œๆœ€ๅคงใ€‚

้—ฎ้ข˜ๆ˜ฏๆœ‰ๅ…ณ็‚น้›†+่ทฏๅพ„็š„๏ผŒไธ้šพๆƒณๅˆฐ็Šถๆ€๏ผšfi,jโ€‹ ่กจ็คบ้ๅކไบ†้›†ๅˆ iโ€‹๏ผŒ่ฟ™ๆกๅ”ฏไธ€็š„่ทฏๅพ„็š„ๅทฒ็ปๆ˜ฏไปŽ 1โ€‹ ๅˆฐ jโ€‹ ็š„็ญ”ๆกˆใ€‚

ๆˆ‘ไปฌ่€ƒ่™‘้€‰ๆ‹ฉ่ทฏๅพ„็š„ๅฝข็Šถ๏ผŒๅคงๆฆ‚ๅบ”่ฏฅๅบ”่ฏฅๆ˜ฏ่ฟ™ๆ ท็š„๏ผš

ๅฐฑๆ˜ฏ 1โˆผn ็š„ไธ€ๆก๏ผŒ็„ถๅŽไธญ้—ด่ฎธๅคšๅˆ†ๅ‰๏ผŒ่ฟžๅ‘ไธ€ไบ›่ฟž้€šๅ—๏ผŒ่€Œ่ฟ™ไบ›่”้€šๅ—ไธญๆ‰€ๆœ‰็š„่พน้ƒฝ่ฟžไธŠใ€‚

ไบŽๆ˜ฏๆˆ‘ไปฌ่€ƒ่™‘่ฝฌ็งปใ€‚

ๅฝ“ j=1 ๆ—ถ๏ผŒfi,j=Ei๏ผŒๅ…ถไธญ Ei ่กจ็คบ iโ€‹ ้›†ๅˆไธญๆ‰€ๆœ‰่พน็š„ๆƒๅ€ผๅ’Œใ€‚

ๅฏไปฅ่ฟžไธ‹ไธ€ไธช้“พไธŠ็š„็‚น๏ผšfiโˆ–{j},k+dk,jโ†’fi,j๏ผŒๅฐฑๆ˜ฏๅœจ k ๅŽ้ขๆ–ฐๅขžไธ€ไธช็‚น j๏ผŒๅฝ“็„ถ่ฟ™ไธช่ฝฌ็งป็š„ๆ—ถๅ€™ dk,j ๅบ”ๅคงไบŽ 0ใ€‚

่ฟ˜ๅฏไปฅไปŽ j ๅ‘ไธ€ไธชไผธๅ‡บๅŽปไธ€ไธช่ฟž้€šๅ—๏ผšfiโˆ–k,j+Ekโ‹ƒ{j}โ†’fi,j๏ผŒๅฝ“็„ถๅ…ถไธญ jโˆ‰kโ€‹ใ€‚

ไปฃ็ 

cpp
#include <cstdio>
#include <bitset>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

const int maxn = 15;
const int inf = 0x3f3f3f3f;

int mmap[maxn][maxn];
LL in[1 << maxn];
LL dp[1 << maxn][maxn];
int n, m;

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0, f, t, d; i < m; ++i)
    {
        scanf("%d%d%d", &f, &t, &d);
        mmap[t - 1][f - 1] = mmap[f - 1][t - 1] = d;
    }
    for (int i = 0; i < (1 << n); ++i)
        for (int j = 0; j < n; ++j)
            if (i & (1 << j))
                for (int k = j + 1; k < n; ++k)
                    if (i & (1 << k))
                        in[i] += mmap[j][k];
    for (int i = 0; i < (1 << n); ++i)
        for (int j = 0; j < n; ++j)
            dp[i][j] = -inf;
    for (int i = 0; i < (1 << n); ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            if (i & (1 << j))
            {
                if (!j)
                    dp[i][j] = in[i];
                else
                {
                    for (int k = 0; k < n; ++k)
                        if (j != k && (i & (1 << k)) && mmap[k][j])
                            dp[i][j] = max(dp[i][j], dp[i ^ (1 << j)][k] + mmap[k][j]);
                    for (int tmp = (i ^ (1 << j)), k = tmp; k; k = (k - 1) & tmp)
                        dp[i][j] = max(dp[i][j], dp[i ^ k][j] + in[k | (1 << j)]);
                }
            }
        }
    }
    printf("%lld\n", in[(1 << n) - 1] - dp[(1 << n) - 1][n - 1]);
    return 0;
}

Footnotes

  1. ็ฟป่ฏ‘ๆฅ่‡ชluoguใ€‚ โ†ฉ

Cite this post

@misc{pu2019oiicpcatcoderarc078d,
  author = {Pu, Fanyi},
  title  = {ARC078F Mole and Abandoned Mine},
  year   = {2019},
  month  = {3},
  url    = {https://pufanyi.com/blog/oi-icpc/atcoder/arc078-d}
}