hdu1526 二分匹配+ floyd
题意:
有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;
}
最新文章
- Hadoop 面试题之storm 3个
- jqury ajax 标准
- JSP页面的中文乱码
- ext4.1Grid中的column多选
- Android(java)学习笔记133:ListViewProject案例(ListView + BaseAdapter + CheckBox)
- CSAPP(深入理解计算机系统)读后感
- 代码风格——Cocos2d-x学习历程(四)
- [Cocos2d-x]Cocos2d-x 3.2 学习笔记
- MySQL密码丢失,解决方法
- 面向对象重写(override)与重载(overload)区别 (转)
- cache 和 buffer的区别
- 初识CSS
- 【精选】Nginx模块Lua-Nginx-Module学习笔记(二)Lua指令详解(Directives)
- Node-debug方法
- uedit,检测粘贴事件,替换粘贴内容
- Vue面试中,经常会被问到的面试题/Vue知识点整理
- 使用Visual Studio Team Services敏捷规划和项目组合管理(四)——冲刺计划和任务板
- 踩坑记录:ubuntu下,http代理无法修改的问题
- 用crash来分析一下proc的文件访问
- ATX 安卓设备 WiFi 统一管理以及设备自动化测试
热门文章
- 02.从0实现一个JVM语言之词法分析器-Lexer-03月02日更新
- 单细胞分析实录(9): 展示marker基因的4种图形(二)
- 使用CSS计数器美化数字有序列表
- js导出execl 兼容ie Chrome Firefox各种主流浏览器(js export execl)
- WIFI6 基本知识(二)
- JVM笔记 -- JVM的生命周期介绍
- 多租缓存实现方案 (Java)
- 如何让python脚本支持命令行参数--getopt和click模块
- 【死磕JVM】一道面试题引发的“栈帧”!!!
- Android | 玩转AppBarLayout,设置scrollFlags滑动属性详解