题意:

有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;

}

最新文章

  1. Hadoop 面试题之storm 3个
  2. jqury ajax 标准
  3. JSP页面的中文乱码
  4. ext4.1Grid中的column多选
  5. Android(java)学习笔记133:ListViewProject案例(ListView + BaseAdapter + CheckBox)
  6. CSAPP(深入理解计算机系统)读后感
  7. 代码风格——Cocos2d-x学习历程(四)
  8. [Cocos2d-x]Cocos2d-x 3.2 学习笔记
  9. MySQL密码丢失,解决方法
  10. 面向对象重写(override)与重载(overload)区别 (转)
  11. cache 和 buffer的区别
  12. 初识CSS
  13. 【精选】Nginx模块Lua-Nginx-Module学习笔记(二)Lua指令详解(Directives)
  14. Node-debug方法
  15. uedit,检测粘贴事件,替换粘贴内容
  16. Vue面试中,经常会被问到的面试题/Vue知识点整理
  17. 使用Visual Studio Team Services敏捷规划和项目组合管理(四)——冲刺计划和任务板
  18. 踩坑记录:ubuntu下,http代理无法修改的问题
  19. 用crash来分析一下proc的文件访问
  20. ATX 安卓设备 WiFi 统一管理以及设备自动化测试

热门文章

  1. 02.从0实现一个JVM语言之词法分析器-Lexer-03月02日更新
  2. 单细胞分析实录(9): 展示marker基因的4种图形(二)
  3. 使用CSS计数器美化数字有序列表
  4. js导出execl 兼容ie Chrome Firefox各种主流浏览器(js export execl)
  5. WIFI6 基本知识(二)
  6. JVM笔记 -- JVM的生命周期介绍
  7. 多租缓存实现方案 (Java)
  8. 如何让python脚本支持命令行参数--getopt和click模块
  9. 【死磕JVM】一道面试题引发的“栈帧”!!!
  10. Android | 玩转AppBarLayout,设置scrollFlags滑动属性详解