题意:

有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. POJ2594(二分匹配+Floyd求传递闭包)

    题目:Treasure Exploration 很明显是最小路径覆盖,只是必须先要求传递闭包就行了. #include <stdio.h> #include <string.h> ...

  2. POJ - 2446 Chessboard 二分匹配+建图

    题目链接 题意很简单,是二分匹配的一种常见的题型,问题就在于怎样转换到二分图上来. 首先对对n*m-k正常点进行编号,然后遍历查找每一个正常点的上下左右是否能连接(就是判断另个点是否也是正常的),如果 ...

  3. poj3041--Asteroids(二分匹配)[将矩阵行列转化为边]

    题目大意,给出n*n的矩阵,其中有m个流星,一下给出每颗流星的坐标,每一次攻击可以消除一行或一列的流星,问最少攻击几次? 竟然是二分匹配!竟然是二分匹配!竟然是二分匹配!竟然是二分匹配! 建图,以行为 ...

  4. 香港大学提出OneNet:一阶段端到端目标检测网络,无需NMS!无需二分匹配!

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 本文作者:孙培泽 |  编辑:Amusi https://zhuanlan.zhihu.com ...

  5. 杭电2063--过山车(二分匹配)

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  6. pku 1486 求出二分匹配图中的必须边

    开始楞是没看懂意思,E文让我很纠结... 要判断一条边是否为二分图中必须边,方法如下: 1.先求出原图的任意最大匹配 2.对二分图某一边的所有点,删去其当前的匹配边.删的过程不是简单的将原图设为不连通 ...

  7. POJ1325二分匹配或者DINIC(最小路径覆盖)

    题意:        有k个任务,两个机器,第一个机器有n个模式,第二个机器有m个模式,每个任务要么在第一个机器的一个模式下工作,要么在第二个机器的一个模式下工作,机器每切换一个模式需要重启一次,两个 ...

  8. POJ2239简单二分匹配

    题意:       一周有7天,每天可以上12节课,现在给你每科课的上课时间,问你一周最多可以上几科课,一科课只要上一节就行了. 思路:       简单题目,直接二分就行了,好久没写二分匹配了,练习 ...

  9. hdu2413 二分+二分匹配

    题意:       地球和外星球大战,地球有n个飞船,外星球有m个飞船,每个飞船有自己的其实战舰和战舰增长率,星球于星球之间有距离,问你最少多少年地球可以打败外星球,每个星球最多只能和一个星球对战.. ...

最新文章

  1. numpy输出到屏幕时有逗号和没逗号的原因
  2. SparkSQL之External Data
  3. IDEA、 JetBrains、webstorm、 pycharm 破解教程
  4. 引用:初探Sql Server 执行计划及Sql查询优化
  5. 小数转换成二进制c语言,只写出了十进制小数转换成二进制的,求二进制小数转十进制的...
  6. 动态规划基础水题提纲
  7. 第 2 章 MongoDB
  8. 全新的PDO数据库操作类(仅适用Mysql)
  9. 你可以分配多大的内存
  10. PHP在Linux上上传文件的注意事项
  11. Python让繁琐工作自动化——chapter18 GUI控制键盘与鼠标
  12. Kotlin从入门到放弃(三)——协程
  13. php 字体设计,时尚前沿:15个创意的3D字体设计艺术作品欣赏
  14. 资源分享 | 敬伟 PS 教程 ABCD 四套全集
  15. document.getelementbyid是什么意思
  16. 开发环境搭建——从零到实盘1
  17. 电子烟中测电阻注意事项
  18. 【多元统计分析】一、多元统计分析概述
  19. linux操作系统之 服务器架构
  20. 用智能TFT液晶模块这种串口屏做产品界面设计太简单了,大大的节省了开发时间...

热门文章

  1. hibernate02环境的搭建
  2. Ionic实战 自动升级APP(Android版)
  3. oschina android版源码中的颜色值
  4. Guava学习笔记:Preconditions优雅的检验参数
  5. 看jquery3.3.1学js类型判断的技巧
  6. Spring学习五(JDBC支持)
  7. C#枚举类型和结构体
  8. Mysql数据库“Communications link failure due to underlying exception”问题
  9. 也跟90后小朋友聊聊
  10. [luogu1131][bzoj1060][ZJOI2007]时态同步【树形DP】