# 588 라운드 Codeforces (사업부. 2) C. Anadi 및 Domino (思维)

링크 :

https://codeforces.com/contest/1230/problem/C

질문의 의미 :

Anadi는 도미노의 집합이 있습니다. 모든 도미노는 두 부분으로, 각 부분은 어떤 점을 포함합니다. 모든 A와 B 등이 1≤a≤b≤6를 들어, 다른 절반에 절반와 b 점에 점 정확히 하나 개의 도미노가있다. 세트는 정확히 21 도미노가 포함되어 있습니다. 여기에 자신의 세트의 정확한 그림이다 :

또한 Anadi 자기 루프 복수 에지없이 무향 그래프를 갖는다. 그는 일부 도미노를 선택하고이 그래프의 가장자리에 그들을 배치하려고합니다. 그는 각 유형의 최대 하나 개의 도미노를 사용할 수 있습니다. 각 가장자리에서 최대 하나의 도미노에 맞게 할 수 있습니다. 이 그래프의 각 가장자리에 도미노를 배치 할 필요는 없습니다.

가장자리에 도미노를 배치 할 때, 그는 또한 그 방향을 선택한다. 즉, 임의의 위치 도미노의 절반은 에지의 엔드 포인트 중 하나를 향하고 있어야하며, 나머지 절반은 다른 끝점 향하는되어야한다. 캐치가있다 : 같은 정점 향한 도미노의 다수의 절반이있는 경우, 이러한 절반의 각 점의 동일한 수를 포함해야합니다.

얼마나 많은 도미노 대부분의 그의 그래프의 가장자리에 자리를 Anadi 수 있습니까?

아이디어 :

직접 열거 DFS를 초과하지 않는다.
표준액을 <., 임의의 방법이 채워질 수 = 6 n 개의 경우
N> 최적 충전로서 두 점의 경우를 고려하여 동일한 값을 갖는 6 개의 열거 동일 가리킨 다음 그것을 빼기, 충족되지 얼마나 많은 경우를 결정합니다.

코드 : 폭력적인 버전을 DFS

#include <bits/stdc++.h>
using namespace std;

int node[10];
pair<int, int> edge[30];
int cnt[10];
int ans;
int n, m;

void Dfs(int step)
{
    if (step > n)
    {
        memset(cnt, 0, sizeof(cnt));
        map<pair<int, int>, bool> Use;
        int tmp = 0;
        for (int i = 1;i <= m;i++)
        {
            int l = edge[i].first, r = edge[i].second;
            int vl = node[edge[i].first], vr = node[edge[i].second] ;
            if (vl == 0 || vr == 0)
                continue;
            if (vl > vr)
                swap(vl, vr);
            if (Use[make_pair(vl, vr)])
                continue;
            tmp++;
            Use[make_pair(vl, vr)] = true;
        }
        ans = max(ans, tmp);
        return ;
    }
    for (int i = 0;i <= 6;i++)
    {
        node[step] = i;
        Dfs(step+1);
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    int u, v;
    for (int i = 1;i <= m;i++)
    {
        cin >> u >> v;
        edge[i].first = u;
        edge[i].second = v;
    }
    Dfs(1);
    cout << ans << endl;

    return 0;
}

추천

출처www.cnblogs.com/YDDDD/p/11621681.html