题意:
有如图所示的 21 个多米诺骨牌,给定一个无向图(无自环,无重边),一条边上可以放置一个多米诺骨牌。要求是如果两条边连接同一个顶点,那就必须使这两条边上的多米诺骨牌指向这个顶点的值相等,可以有不放的情况,问给定的图中最多可以放多少个多米诺骨牌。
思路:
假设n<=6每条边都可以放满多米诺骨牌,当n=7时,必定有2个点对应的数字是相同的,那么怎么确定这2个点呢,我们可以假设点i和点j对应的数字相同,那么当i和j分别与点k有边的时候,我们只能选择在i与k(或j与k)之间放一个多米诺骨牌,相当于我们舍弃了其中一条边,所以我们可以找到舍弃边后最大的ans。
AC代码
#include <bits/stdc++.h>
using namespace std;
bool dis[10][10];
int main() {
int n, m;
scanf("%d%d",&n,&m);
memset(dis,0,sizeof(dis));
for (int i = 0; i < m; i ++) {
int u, v;
scanf("%d%d",&u,&v);
dis[u][v] = 1;
dis[v][u] = 1;
}
if (n <= 6) printf("%d\n", m);
else {
int ans = 0;
for (int i = 1; i <= 7; i ++) {
for (int j = 1; j <= 7; j ++) {
int res = m;
for (int k = 1; k <= 7; k ++) {
if (dis[i][k] && dis[j][k]) res --;
}
ans = max(ans,res);
}
}
printf("%d\n", ans);
}
}