其他分享
首页 > 其他分享> > Codeforces Round #588 (Div. 2) C. Anadi and Domino

Codeforces Round #588 (Div. 2) C. Anadi and Domino

作者:互联网

题目

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

题意

在这里插入图片描述
有如图所示的 21 个多米诺骨牌,给定一个无向图(无自环,无重边),一条边上可以放置一个或者不放置多米诺骨牌。要求是从一个顶点出发的边,如果放置两个多米诺骨牌的话,指向顶点的半个多米诺骨牌必须相同。(如图)
在这里插入图片描述
问给定的图中最多可以放多少个多米诺骨牌。

题解

如果n<=6的话,有多少条边就能放置多少个多米诺骨牌。因为这些多米诺骨牌正好可以表示6个点互相连接的边。比如6-1连就用1-6的多米诺骨牌,3-5连就用3-5的多米诺骨牌,以此类推。
如果n>6的话,第七个点最多只能连一条线(1-1,2-2,3-3…6-6)中的一种。
所以我们每两个点都要判断有哪些重复的点,挑选重复最少的点当作第7个顶点。

代码

#include<bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int g[10];
int dis[10][10];
bool cmp(int x,int y){
	return x>y;
}
int main()
{
	int n,m,cnt = 0,ans = 0;
	mem(dis,0);
	scanf("%d %d",&n,&m);
	for(int i=0;i<m;i++)
	{
		int a,b;
		scanf("%d %d",&a,&b);
		dis[a][b] = 1;
		dis[b][a] = 1;
	}
	if(n>=7)
	{
		ans = 100;
		for(int i=1;i<7;i++)
		{
			for(int j=i+1;j<=7;j++)
			{
				cnt = 0;
				for(int k=1;k<=7;k++)
				{
					if(dis[i][k]==dis[j][k]&&dis[i][k]==1) cnt++;
				}
				ans=min(cnt,ans);
			}
		}
	}
	printf("%d\n",m-ans);
	return 0;
}

标签:10,多米诺骨牌,int,Domino,Codeforces,Anadi,放置,顶点,define
来源: https://blog.csdn.net/weixin_43911945/article/details/101469947