题意:

有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. 《PYTHON机器学习及实践-从零开始通往KAGGLE竞赛之路》 分享下载

    转: <PYTHON机器学习及实践-从零开始通往KAGGLE竞赛之路> 分享下载 书籍信息 书名: PYTHON机器学习及实践-从零开始通往KAGGLE竞赛之路 标签: PYTHON机器学 ...

  2. KeyboardDemo - Android身份证号、车牌号快捷输入键盘

    Android身份证号.车牌号快捷输入键盘 项目地址 Github 键盘部分在 keyboard module 中 键盘与EditText绑定参照 MainActivity

  3. Hi3559板载u-boot、kernel及rootfs烧录过程及心得

    这一篇随笔讲叙述下基于Hi3559AV100的BOXER-8410AI板载u-boot.kernel及rootfs烧录具体过程及遇到问题的解决方法与心得. 1.前期板载启动测试和烧录手段 1.1.烧写 ...

  4. 【图像处理】使用OpenCV+Python进行图像处理入门教程(二)

    这篇随笔介绍使用OpenCV进行图像处理的第二章 图像的运算,让我们踏上继续回顾OpenCV进行图像处理的奇妙之旅,不断地总结.回顾,以新的视角快速融入计算机视觉的奥秘世界. 2  图像的运算 复杂的 ...

  5. 零投资!零风险!手把手教你挖pi币

    为什么说PI币属于区块链4.0代币呢?我们先从人类社会的生产力生产关系的递进来做一波有利的证明! 原始社会--封建王朝--君主立宪--资本主义--社会主义 原始社会:社会物质财富分配既有弱肉强食也有按 ...

  6. 为什么要从 Linux 迁移到 BSD 5

    为什么要从 Linux 迁移到 BSD 5 干净的分离 在 FreeBSD 的设计方式下,不同的组件组合在一起的,处理配置和调优,以及多年来开发和改进的所有工具,使得使用 FreeBSD 是一件很特别 ...

  7. EmEditor, 在正则使用()匹配后 使用$1 $2进行对括号内的值进行引用

    $1表示第一个括号,$2表示第二个括号,以此类推

  8. springcloud知识点总结

    一.SpringCloud面试题口述1.SpringCloud和DubboSpringCloud和Dubbo都是现在主流的微服务架构SpringCloud是Apache旗下的Spring体系下的微服务 ...

  9. python之routes入门

    一.入门 from routes import Mapper map = Mapper() # 创建一个mapper()路由实例对象 # connect注册路由信息 # 路由名称'zbj', 路径是 ...

  10. CSS行内元素盒模型

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...