HDU 5727 Necklace

枚举环排列+二分图匹配计算答案。

可以枚举一下yin的排列方式,因为是环,所以可以固定一个,剩下的8个进行全排列。

对于每一个全排列,会产生n个位置供yang放置,如果某位置放置某yang不会使该yang褪色,则该位置向该yang连边。

然后跑一次二分图最大匹配,即可得到在yin这样的排列方式下,最多有多少yang不会褪色,更新一下答案。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;

const int maxn=12;
int n,m,nx,ny;
int g[maxn][maxn],cx[maxn],cy[maxn],mk[maxn];
bool f[maxn][maxn];
int p[maxn];

int path(int u)
{
    for(int v=0; v<ny; v++)
    {
        if(g[u][v]&&!mk[v])
        {
            mk[v]=1;
            if(cy[v]==-1||path(cy[v]))
                { cx[u]=v,cy[v]=u; return 1; }
        }
    }
    return 0;
}

int MaxMatch()
{
    int res=0;
    memset(cx,-1,sizeof(cx));
    memset(cy,-1,sizeof(cy));
    for(int i=0; i<nx; i++)
    {
        if(cx[i]==-1)
        {
            memset(mk,0,sizeof(mk));
            res=res+path(i);
        }
    }
    return res;
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        memset(f,0,sizeof f);
        for(int i=1;i<=m;i++)
        {
            int u,v; scanf("%d%d",&u,&v);
            f[u][v]=1;
        }

        if(n==0) {printf("0\n"); continue;}

        int ans=0x7fffffff;
        for(int i=1;i<=n;i++) p[i]=i; nx=ny=n;
        do
        {
            memset(g,0,sizeof g);
            for(int i=1;i<=n;i++)
            {
                for(int j=0;j<n;j++)
                {
                    if(j==0&&f[i][p[n]]==0&&f[i][p[1]]==0) g[j][i-1]=1;
                    else if(j!=0&&f[i][p[j]]==0&&f[i][p[j+1]]==0) g[j][i-1]=1;
                }
            }
            ans=min(ans,n-MaxMatch());
        }while(next_permutation(p+1,p+n)&&ans);
        printf("%d\n",ans);
    }
    return 0;
}
//.
时间: 2024-10-13 01:05:31

HDU 5727 Necklace的相关文章

hdu 5727 Necklace 阴阳珠 二分图匹配+暴力全排列

Necklace Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2462    Accepted Submission(s): 775 Problem Description SJX has 2*N magic gems. N of them have Yin energy inside while others have Yang e

HDU 5727 Necklace 二分图匈牙利最大匹配,

给你阴阳球各n个,某些阳球只要周围有一个阴球,就会变暗,问最后至少要变暗多少个. 看了题解,说是全排列阴球,因为成环,所以就能变成8!复杂度,就能跑了. 然后每种情况,如果一个阳球碰上周围两个阴球都不变暗,那么久能放在这个位置,此时的最大匹配就是这种方案,最大可以放,并且不变暗的,个数.拿n一减,完事取最小值就行.就是暴力. 完事还有一个最好用的函数next......(bulabula),直接得到全排列. #include <iostream> #include <cstdio>

hdu 5727 Necklace 二分图匹配

题目链接 给2*n个珠子, n<=9, n个阴n个阳. 然后将它们弄成一个环, 阴阳交替.现在给你m个关系, 每个关系给出a, b. 如果阳a和阴b挨着, 那么a就会变暗. 问你最小变暗几个阳. 我们求出阴的所有全排列, 是9!, 因为形成一个环. 所以可以想象成一个珠子是固定不变的, 剩下n-1个变, 所以就是8!. 然后对于每种情况, 就是我们熟悉的二分图匹配了. 对于两个阴珠之间的空隙, 如果阳珠可以放到这里就连一条边. 然后跑匈牙利匹配就可以了. 9!过不了... #include <

HDU 5727 Necklace 二分+匹配

这是从山东大学巨巨那里学来的做法 枚举下黑色球的排列总数是8!,然后八个白球可选的位置与左右两个黑球存不存在关系建图就行 这是原话,具体一点,每次生成环排,只有互不影响的才连边 最后:注重一点,n个数环排是(n-1)! #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <vector> #include <map&

HDU 5727 Necklace ( 2016多校、二分图匹配 )

题目链接 题意 : 给出 2*N 颗珠子.有 N 颗是阴的.有 N 颗是阳的.现在要把阴阳珠子串成一个环状的项链.而且要求珠子的放置方式必须的阴阳相间的.然后给出你 M 个限制关系.格式为 ( A.B ) 表示如果阳性 A 珠子和阴性 B 珠子相邻的话.那么阳性珠子就会衰弱.问你在最优的情况下.最少有多少颗阳珠子是衰弱的 分析 : 看题目 N 的大小只有 9 不免让人浮想联翩.跃跃欲试枚举暴力 直接暴力还是不行的 首先先枚举阴珠子所在的位置 这个可以用 next_permutation 解决 然

hdu 5727 二分图+环排列

Necklace Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2423    Accepted Submission(s): 766 Problem Description SJX has 2*N magic gems. N of them have Yin energy inside while others have Yang e

hdu 1817 Necklace of Beads(Polya定理)

题目链接:hdu 1817 Necklace of Beads 这题的弱化版:传送门 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 typedef long long ll; 5 6 int t,n,m,cas; 7 8 ll mypow(ll a,ll k){ 9 ll an=1; 10 while(k){ 11 if(k&1)an=an*a

HDU 3874 Necklace 区间查询的离线操作

题目: http://acm.hdu.edu.cn/showproblem.php?pid=3874 对需要查询的区间按右端点排序,然后从左到右依次加入序列中的元素,同时更新,更新的方法是,把上一次出现a[i]值的点变为0,这一次a[i]值的点(即 i)变为a[i],这样保证了前i个元素中只存在一个等于a[i]值得元素,那为什么这样不会影响后面的查询呢? 因为是处理到i点,则把右边界等于a[i]的查询处理掉,剩下的待查询的区间右边界在i点之后,如果左边界在i之前,那么也会包含i点,也就包含了i点

HDU 3874 Necklace (线段树单点更新+区间查询+离线操作)

Problem Description Mery has a beautiful necklace. The necklace is made up of N magic balls. Each ball has a beautiful value. The balls with the same beautiful value look the same, so if two or more balls have the same beautiful value, we just count