HDU 5727 Necklace 二分+匹配

这是从山东大学巨巨那里学来的做法

枚举下黑色球的排列总数是8!,然后八个白球可选的位置与左右两个黑球存不存在关系建图就行

这是原话,具体一点,每次生成环排,只有互不影响的才连边

最后:注重一点,n个数环排是(n-1)!

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int N=2e5+5;
int pos[10],n,m,match[10],ret;
bool vis[10],used[10],g[10][10],mp[10][10];
bool dfs(int u){
  for(int v=1;v<=n;++v){
    if(!g[u][v]||used[v])continue;
    used[v]=true;
    if(match[v]==-1||dfs(match[v])){
      match[v]=u;
      return true;
    }
  }
  return false;
}
void solve(){
  memset(match,-1,sizeof(match));
  memset(g,false,sizeof(g));
  for(int i=2;i<=n;++i){
    for(int j=1;j<=n;++j){
      if(mp[pos[i]][j]||mp[pos[i-1]][j])
        continue;
      g[i][j]=true;
    }
  }
  for(int i=1;i<=n;++i){
    if(mp[pos[1]][i]||mp[pos[n]][i])
      continue;
    g[1][i]=true;
  }
  int ans=0;
  for(int i=1;i<=n;++i){
    memset(used,false,sizeof(used));
    if(dfs(i))++ans;
  }
  ret=min(ret,n-ans);
}
void get(int x){
  if(ret==0)return;
  if(x==n+1){solve();return;}
  for(int i=1;i<=n;++i){
    if(vis[i])continue;
    pos[x]=i;
    vis[i]=true;
    get(x+1);
    vis[i]=false;
  }
}
int main(){
  vis[1]=true;pos[1]=1;
  while(~scanf("%d%d",&n,&m)){
     if(n==0){
      printf("0\n");
      continue;
     }
     memset(mp,0,sizeof(mp));
     while(m--){
      int u,v;
      scanf("%d%d",&u,&v);
      mp[v][u]=true;
     }
     ret=INF;
     get(2);
     printf("%d\n",ret);
  }
  return 0;
}

时间: 2024-10-13 01:39:52

HDU 5727 Necklace 二分+匹配的相关文章

hdu 5727 Necklace 二分图匹配

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

Hdu 1045 二分匹配

题目链接 Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6282    Accepted Submission(s): 3551 Problem Description Suppose that we have a square city with straight streets. A map of a city i

HDU 2819 Swap (二分匹配+破输出)

题意:给定上一个01矩阵,让你变成一个对角全是 1 的矩阵. 析:二分匹配,把行和列看成两个集合,用匈牙利算法就可以解决,主要是在输出解,在比赛时一紧张不知道怎么输出了. 输出应该是要把 match[i] = i 这样的输出,然后再改掉后面那个,真是个大傻逼输出,气死了..... 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <strin

hdu 3081 【二分匹配+并查集+删边||最大路+并查集+二分枚举】

Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2307    Accepted Submission(s): 792 Problem Description Presumably, you all have known the question of stable marriage match. A

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 ( 2016多校、二分图匹配 )

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

Hdu 1281 棋盘游戏 (二分匹配)

题目链接: Hdu 1281 棋盘游戏 题目描述: 题目汉语,只说一点,国际象棋中车的攻击范围就像n皇后问题中的皇后一样,同行和同列的车都会相互攻击. 解题思路: 求出来的最大匹配数目==最多能放几个车.计算有几个格子是重要点的时候只需要算出最大的匹配数目,然后枚举每个点不能放置棋子时候的最大匹配数目.最大匹配数目小于原匹配数目的时候,当前枚举点就是重要点. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostre

hdu 2119 Matrix(二分匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2119 Matrix Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2205    Accepted Submission(s): 975 Problem Description Give you a matrix(only contains

HDU 5727 Necklace

枚举环排列+二分图匹配计算答案. 可以枚举一下yin的排列方式,因为是环,所以可以固定一个,剩下的8个进行全排列. 对于每一个全排列,会产生n个位置供yang放置,如果某位置放置某yang不会使该yang褪色,则该位置向该yang连边. 然后跑一次二分图最大匹配,即可得到在yin这样的排列方式下,最多有多少yang不会褪色,更新一下答案. #include<cstdio> #include<cstring> #include<cmath> #include<alg