링크 :
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;
}