想法-Codeforces-1230C-Anadi and Domino

题目链接
题意:
给定一个n,一个m,表示一个图中有n个点,m条边(这m条边保证没有自己连自己和重复的情况)。
有21种多米诺骨牌,每个多米诺骨牌有两部分,每个部分有一个数字。
(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)
(2,2)(2,3)(2,4)(2,5)(2,6)
(3,3)(3,4)(3,5)(3,6)
(4,4)(4,5)(4,6)
(5,5)(5,6)
(6,6)
以上为21中多米诺骨牌上的数字。
每种牌有一个,每条边上最多可以放一个牌,要求指向同一点的所有数字都相同,问这个图中最多能放多少个牌。
样例:
输入:
7 21
1 2 1 3 1 4 1 5 1 6 1 7
2 3 2 4 2 5 2 6 2 7
3 4 3 5 3 6 3 7
4 5 4 6 4 7
5 6 5 7
6 7
输出:
16
思路:
第一种情况:如果一个图中只有小于等于6个点,让每个点对应一个数字,然后放置相应的多米诺骨牌即可。
第二种情况:如果一个图中有7个点,假如一个点连了6条边,假如让点1对应数字1(即指向1点的骨牌都必须是数字1),点1连了6条边,那么其他六个点分别对应1 2 3 4 5 6,有一个数字也对应了数字1,这个也对应1的点就找不到可以用的骨牌放在和他相连的其他边上了。所以找任意两个数字公共连接的点的数量最少,然后让这两个点对应同一个数字,其他五个分别对应其他五个数字即可使放入的骨牌的数量最多。
代码:

#include <bits/stdc++.h>
using namespace std;
int flag[10][10];
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    int i, j, k;
    for (i = 1; i <= m; i++)
    {
        int a, b;
        scanf("%d%d", &a, &b);
        flag[a][b] = 1, flag[b][a] = 1;
    }
    if (n < 7)
        printf("%d\n", m);
    else
    {
        int cnt, minn = 100;
        for (i = 1; i <= 6; i++)
        {
            for (j = i + 1; j <= 7; j++)
            {
                cnt = 0;
                for (k = 1; k <= 7; k++)
                {
                    if (flag[i][k] == 1 && flag[j][k] == 1)
                        cnt++;
                }                      //cnt表示每两个点连的一样的点的数目
                minn = min(minn, cnt); //minn表示 任意两个点连的一样的点的数目 的最小值
            }
        }
        printf("%d\n", m - minn);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值