题意:

有N个插座,M个用电器,和K种转换器(每种有无限个),问最少多少个用电器无法充电.

思路 :  总的电器数 减去 电器和插座的最大匹配数

我有的是map去映射每一个串,根据转换器建边,然后跑一边floyd(为了确定连通性),

跑完后就再建一个图匹配用,这个图中当 i 插座和j用电器之间的距离不是inf时就可以连接ij;

然后一边匈牙利就ok了,提醒一点就是插座,用电器,转换器中的字符串有可能会出现不同的,

所以每一次建边的时候记得映射下就行了..

#include<stdio.h>

#include<string.h>

#include<string>

#include<map>

#define N 100 + 10

#define N_node 500 + 10

#define N_edge 10000 + 100

#define inf 100000000

using namespace std;

typedef struct

{

   int to ,next;

}STAR;

typedef struct

{

   char str[30];

}CHAZUO;

typedef struct

{

   char str[30];

}YONGHU;

CHAZUO cz[N];

YONGHU yh[N];

STAR E[N_edge];

int list[N_node] ,tot;

int mk_gx[N_node] ,mk_dfs[N_node];

int mp[N_node][N_node];

map<string,int>hash_node;

void add(int a, int b)

{

   E[++tot].to = b;

   E[tot].next = list[a];

   list[a] = tot;

}

int minn(int x ,int y)

{

   return x < y ? x : y;

}

void floyd(int n)

{

   for(int k = 1 ;k <= n ;k ++)

   for(int i = 1 ;i <= n ;i ++)

   for(int j = 1 ;j <= n ;j ++)

   mp[i][j] = minn(mp[i][j] ,mp[i][k] + mp[k][j]);



int DFS_XYL(int s)

{

   for(int k = list[s] ;k ;k = E[k].next)

   {

      int to = E[k].to;

      if(mk_dfs[to]) continue;

      mk_dfs[to] = 1;

      if(mk_gx[to] == -1 || DFS_XYL(mk_gx[to]))

      {

         mk_gx[to] = s;

         return 1;

      }

   }

   return 0;

}

int main ()

{

   int n ,m ,k ,i ,j ,t ,nowt ,a ,b;

   char str1[30] ,str2[30];

   scanf("%d" ,&t);

   while(t--)

   {

      hash_node.clear();

      nowt = 0;

      scanf("%d" ,&n);

      for(i = 1 ;i <= n ;i ++)

      {

         scanf("%s" ,cz[i].str);

         if(hash_node[cz[i].str] == 0)

         hash_node[cz[i].str] = ++ nowt;

      }

      scanf("%d" ,&m);

      for(i = 1 ;i <= m ;i ++)

      scanf("%s%s",str1 ,yh[i].str);

      for(i = 1 ;i <= 500 ;i ++)

      for(j = 1 ;j <= 500 ;j ++)

      if(i == j)mp[i][j] = 0;

      else mp[i][j] = inf;

      scanf("%d" ,&k); 

      for(i = 1 ;i <= k ;i ++)

      {

         scanf("%s%s" ,str1 ,str2);

         if(hash_node[str1] == 0)

         hash_node[str1] = ++ nowt; 

         if(hash_node[str2] == 0)

         hash_node[str2] = ++ nowt;

         a = hash_node[str1];

         b = hash_node[str2];       

         mp[a][b] = 1;

      }

      floyd(nowt);

      memset(list ,0 ,sizeof(list));

      tot = 1;

      for(i = 1 ;i <= m ;i ++)

      for(int j = 1 ;j <= n ;j ++)

      {

         if(hash_node[yh[i].str] == 0)

         hash_node[yh[i].str] = ++nowt;

         if(mp[hash_node[yh[i].str]][hash_node[cz[j].str]] == inf)

         continue;

         add(i ,j);

      }

      int sum = 0;

      memset(mk_gx ,255 ,sizeof(mk_gx));

      for(i = 1 ;i <= nowt ;i ++)

      {

         memset(mk_dfs ,0 ,sizeof(mk_dfs));

         sum += DFS_XYL(i);

      }

      printf("%d\n" ,m - sum); 

      if(t)puts("");

   }

   return 0;

}

hdu1526 二分匹配+ floyd的更多相关文章

  1. N - Optimal Milking - POJ 2112(二分图多重匹配+Floyd+二分搜索)

    题意:有K太挤奶机,C头奶牛,每个挤奶机每天只能为M头奶牛服务,下面给的K+C的矩阵,是形容相互之间的距离,求出来走最远的那头奶牛要走多远 分析:应该先使用floyd求出来点之间的最短路??(不晓得给 ...

  2. BNUOJ 12756 Social Holidaying(二分匹配)

    题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=12756 Social Holidaying Time Limit: 3000ms Memo ...

  3. kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树

    二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j ...

  4. The Maximum Unreachable Node Set 【17南宁区域赛】 【二分匹配】

    题目链接 https://nanti.jisuanke.com/t/19979 题意 给出n个点 m 条边 求选出最大的点数使得这个点集之间 任意两点不可达 题目中给的边是有向边 思路 这道题 实际上 ...

  5. POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24081   Accepted: 106 ...

  6. [kuangbin带你飞]专题十 匹配问题 二分匹配部分

    刚回到家 开了二分匹配专题 手握xyl模板 奋力写写写 终于写完了一群模板题 A hdu1045 对这个图进行 行列的重写 给每个位置赋予新的行列 使不能相互打到的位置 拥有不同的行与列 然后左行右列 ...

  7. BZOJ 1189 二分匹配 || 最大流

    1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1155  Solved: 420[Submi ...

  8. Kingdom of Obsession---hdu5943(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5943 题意:给你两个数n, s 然后让你判断是否存在(s+1, s+2, s+3, ... , s+n ...

  9. poj 2060 Taxi Cab Scheme (二分匹配)

    Taxi Cab Scheme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5710   Accepted: 2393 D ...

随机推荐

  1. Wireshark使用记录

    TCP/IP协议族里的协议众多 要一一精通比较困难,在一些紧急急需要分析主机.客户端的流量场景时,不懂协议也要上!下面就是用到哪里就记录到哪,有错误欢迎评论指出,多谢. wireshark这玩意相当于 ...

  2. Mac创建Root用户

    1.打开Mac终端管理工具 前往-实用工具-终端 2.用命令的形式创建账户 sudo passwd root 3.输入当前登录用户密码 4.输入root用户密码并验证

  3. DES加密详解

    目录 1 根据输入的秘钥得到16个子秘钥 1.1 大致流程 1.2 利用PC-1从K_0中挑出K_1 1.3 利用PC-2从K_1中挑出16个子秘钥 2 利用16个子秘钥对明文进行加密 2.1 大致流 ...

  4. Boltdb学习笔记之〇--概述

    更多精彩内容,请关注微信公众号:后端技术小屋 看了boltdb也有一阵子了,看完之后总想写点什么,因为感觉到这可能是个不小的坑,所以迟迟没有动笔(没错我的拖延症又犯了..).最近有一种流行的说法:如果 ...

  5. Hi3359AV100 NNIE开发(1)-RFCN demo LoadModel函数与参数解析

    之后随笔将更多笔墨着重于NNIE开发系列,下文是关于Hi3359AV100 NNIE开发(1)-RFCN demo LoadModel函数与参数解析,通过对LoadModel函数的解析,能够很好理解. ...

  6. rest framework Views

    基于类的意见 Django的基于类的意见是从旧式的观点颇受欢迎. - Reinout面包车里斯 REST框架提供了一个APIView类,它的子类Django的View类. APIView类是从正规不同 ...

  7. 建立高速缓存机制-java版

    前言 ​ 一台计算机的核心是CPU,它是计算机系统的运算和控制核心.由于它处理运算速度快,所以基本都会给CPU配置一级缓存,当CPU要读取一个数据时,首先从缓存中查询,如果没有在从内存或者磁盘块中找. ...

  8. Maven安装本地依赖包

    前提已安装maven并且配置了环境变量1.进入jar包所在的目录,打开cmd2.了解包的groupId.artifactId.version2.输入命令(依赖sdk为例)---maven命令mvn i ...

  9. Android Studio 之 编写精美的聊天界面

    •准备工作 首先制作一张 .9 格式的聊天气泡,参见我的这篇博客: 需要注意的是,制作完成后,应该将原始文件删除,否则AS会分不清楚而报错. 新建一个 Empty Activity,Java 和 XM ...

  10. Hadoop学习笔记—HDFS

    目录 搭建安装 三个核心组件 安装 配置环境变量 配置各上述三组件守护进程的相关属性 启停 监控和性能 Hadoop Rack Awareness yarn的NodeManagers监控 命令 hdf ...