题目
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;
}