Problem F Plug It In!
题目链接:https://cn.vjudge.net/contest/245468#problem/F
大意:给你插座和电器的对应关系,有多个电器对应一个插座的情况,但是一个插座只能供一个电器使用,现在有一个转换头,能够将一个插座改成三个插头,问你最多能匹配多少个电器。
思路: HK(洪凯)的思路。先按照没有转换头的思路跑一下匈牙利算法。然后,遍历有多个电器对应一个插座的这种情况,再“加”上两个插座,不过加上的这两个插座,对应关系和你当前正在遍历的这个插座与灯泡的对应关系相同,然后再看一下加入的这两个插座能不能匹配到灯泡,然后求出最大匹配量。
代码:
#include<iostream>
#include<string>
#include<cstring>
#include<iomanip>
#include<map>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
using namespace std;
#define maxn 1500+10
int m,n,k;
int vis[maxn];
int net[maxn];
int e[maxn];
int a[maxn];
vector<int >q[maxn];
vector<int >wa[maxn];
bool Find(int t)
{
int len=q[t].size();
for(int i=0; i<len; i++)
{
int temp=q[t][i];
if(vis[temp]==0)
{
vis[temp]=1;
if(net[temp]==0||Find(net[temp]))
{
net[temp]=t;
return true;
}
}
}
return false;
}
int match()
{
int ans=0;
for(int i=1; i<=m; i++)
{
memset(vis,0,sizeof(vis));
if(Find(i))ans++;
}
return ans;
}
int main()
{
memset(a,0,sizeof(a));
memset(net,0,sizeof(net));
cin>>m>>n>>k;
for(int i=1; i<=k; i++)
{
int u,v;
cin>>u>>v;
q[u].push_back(v);//建立插座与灯泡的对应关系,方便后面的遍历。
a[u]++;//记录插座对应的灯泡的个数
}
int t=match();
// cout<<t<<endl;
int maxx=0;
for(int i=1; i<=n; i++)
{
e[i]=net[i];
}
for(int i=1; i<=m; i++)
{
if(a[i]>1)
{
int s=0;
int len=q[i].size();
for(int k=1; k<=2; k++)
{
for(int j=0; j<len; j++)
{
int temp=q[i][j];
q[m+k].push_back(temp);
}
}//加上两个插座
memset(vis,0,sizeof(vis));
if(Find(m+1))s++;
memset(vis,0,sizeof(vis));//注意每次对vis数组进行清空。
if(Find(m+2))s++;
maxx=max(s,maxx);
q[m+1].clear();
q[m+2].clear();//清除新加入的两个的插座的对应关系
for(int l=1; l<=n; l++)
{
net[l]=e[l];
}//在匹配新加的两个插座的时候,原来的灯泡与插座的对应关系有可能会改变,所以需要恢复到原来的对应关系
if(t==n)break;
}
}
cout<<t+maxx<<endl;
return 0;
}
Problem F Plug It In!的更多相关文章
- 实验12:Problem F: 求平均年龄
Home Web Board ProblemSet Standing Status Statistics Problem F: 求平均年龄 Problem F: 求平均年龄 Time Limit: ...
- The Ninth Hunan Collegiate Programming Contest (2013) Problem F
Problem F Funny Car Racing There is a funny car racing in a city with n junctions and m directed roa ...
- Codeforces Gym 100500F Problem F. Door Lock 二分
Problem F. Door LockTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/at ...
- Codeforces Gym 100002 Problem F "Folding" 区间DP
Problem F "Folding" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/ ...
- Codeforces Gym 100286F Problem F. Fibonacci System 数位DP
Problem F. Fibonacci SystemTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudg ...
- Problem F: Exponentiation
Problem F: ExponentiationTime Limit: 1 Sec Memory Limit: 128 MBSubmit: 4 Solved: 2[Submit][Status][W ...
- Problem F: 合唱比赛开始了!
Problem F: 合唱比赛开始了! Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 440 Solved: 201[Submit][Status][ ...
- 几何入门合集 gym101968 problem F. Mirror + gym102082 Problem F Fair Chocolate-Cutting + gym101915 problem B. Ali and Wi-Fi
abstract: V const & a 加速 F. Mirror 题意 链接 问题: 有n个人在y=0的平面上(及xoz平面).z=0平面上有一面镜子(边平行于坐标轴).z=a平面上有q个 ...
- 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem F. Judging Time Prediction 优先队列
Problem F. Judging Time Prediction 题目连接: http://www.codeforces.com/gym/100253 Description It is not ...
随机推荐
- Nginx PREACCESS阶段 如何限制每个客户端的并发连接数
L:55 nginx.conf配置文件列子 limit_conn_zone $binary_remote_addr zone=addr:10m; #这里根据用户IP地址作为key做限制 并且名称为ad ...
- json_decode()相关报错
错误描述 PHP Warning: json_decode() expects parameter 1 to be string, array given in xxx.php on line 29 ...
- Catenyms POJ - 2337(单词+字典序输出路径)
题意: 就是给出几个单词 看能否组成欧拉回路或路径 当然还是让输出组成的最小字典序的路 解析: 还是把首尾字母看成点 把单词看成边 记录边就好了 这题让我对fleury输出最小字典序又加深了一些 ...
- [luogu4264][USACO18FEB]Teleportation
题解 先吐槽一波题目:便便传送门,出题人还真的有一点厉害的滑稽. 废话不多说. 首先问题的本质就是求如果当这个传送门的端点位于\(y\)的时候,最小的求出总代价,我们设为函数\(f(y)\). 因为这 ...
- 做一个懒COCOS2D-X程序猿(一)停止手打所有cpp文件到android.mk
前言:”懒”在这里当然不是贬义词,而是追求高效,拒绝重复劳动的代名词!做一个懒COCOS2D-X程序猿的系列文章将教会大家在工作中如何偷懒,文章篇幅大多较短,有的甚至只是几行代码,争取把懒发挥到极致! ...
- Segment 李超线段树
题目大意: 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 2.给定一个数 k,询问与直线 x = k 相交的线段中,交点最靠上的线段的编号. 若 ...
- 洛谷P4383 林克卡特树
题意:树上最长不相交k条链. #include <cstdio> #include <algorithm> #include <cstring> typedef l ...
- 洛谷P1850 换教室
令人印象深刻的状态转移方程... f[i][j][0/1]表示前i个换j次,第i次是否申请时的期望. 注意可能有重边,自环. 转移要分类讨论,距离是上/这次成功/失败的概率乘相应的路程. 从上次的0/ ...
- js的append拼接html丢失css样式解决
htmlApp += "<li id='leftli"+lunci+"'>"; htmlApp += "<span id='left ...
- Java: |(或运算) 与 多选判断
今天需要在程序中做一个多选判断,突然想起以前经常遇到的 x |= y | z; 这样的,我也明白这个是多选的用意,但为什么能达到我们希望的多选操作,我还真的没去研究过. 今天早上,百度了一下,搜索到了 ...