HackerRank training-the-army
Description
有 \(n\) 个技能,每次可以通过一个巫师,将一个技能转化成另一个技能,问最有最多有多少不同的技能.
Sol
网络流.
先说说我一开始非常 naive 的建图,将技能拆点,中间加一列巫师, \(S\) 向初始技能连边容量为个数,对应点之间连边容量为 \(INF\),然后从拆出来的点向 \(T\) 连边,容量为 \(1\) ,巫师从左边连一个点右边连一个点,容量为 \(1\).
然而这样可以过大部分的点...数据好弱...
其实这样建图是错的...我是想着用最大流表示一种情况,但是少考虑了一种情况就是巫师将一个技能换成另一个技能之后还可以继续变换.
这样其实就不用拆点,直接连巫师,然后从巫师直接连回去就可以了...
Code
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<iostream>
using namespace std; const int N = 555; inline int in(int x=0,char ch=getchar()){ while(ch>'9' || ch<'0') ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x; } struct NetWork{
struct Edge{ int fr,to,flow; };
vector<Edge> edge;
vector<int> g[N];
int p[N],cur[N],d[N],a[N],aa[N],w[N];
int s,t,m,n,k,flow,cp; void Add_Edge(int fr,int to,int fl){
edge.push_back((Edge){ fr,to,fl }),edge.push_back((Edge){ to,fr,0 });
m=edge.size(),g[fr].push_back(m-2),g[to].push_back(m-1);
}
int BFS(){
memset(d,0,sizeof(d));d[s]=1;
queue<int> q;q.push(s);
for(int x;!q.empty();){
x=q.front(),q.pop();
for(int i=0,v;i<g[x].size();i++) if(!d[v=edge[g[x][i]].to] && edge[g[x][i]].flow>0)
d[v]=d[x]+1,q.push(v);
}return d[t]>0;
}
int Dinic(){
flow=0;
for(int x,k,mine,minf;BFS();){
for(memset(cur,0,sizeof(cur)),k=0,x=s;;){
if(x==t){
mine=-1,minf=0x7fffffff;
for(int i=0;i<k;i++) if(edge[p[i]].flow < minf) minf=edge[p[i]].flow,mine=i;
for(int i=0;i<k;i++) edge[p[i]].flow-=minf,edge[p[i]^1].flow+=minf;
k=mine,flow+=minf,x=edge[p[mine]].fr;
}
for(int &i=cur[x];i<g[x].size();i++){
Edge &e=edge[g[x][i]];
if(e.flow>0 && d[x]+1==d[e.to]) break;
}
if(cur[x]<g[x].size()){
p[k]=g[x][cur[x]],x=edge[p[k++]].to;
}else{
if(!k) break;
d[x]=-1,x=edge[p[--k]].fr;
}
}
}return flow;
}
void init(){
n=in(),k=in();
s=n+k+1,t=s+1;
for(int i=1,x;i<=n;i++) x=in(),Add_Edge(s,i,x),Add_Edge(i,t,1);
for(int i=1,x,y;i<=k;i++){
x=in();
for(int j=1,tmp;j<=x;j++) tmp=in(),Add_Edge(tmp,n+i,1);
y=in();
for(int j=1,tmp;j<=y;j++) tmp=in(),Add_Edge(n+i,tmp,1);
}
cout<<Dinic()<<endl;
}
}sol; int main(){
sol.init();
return 0;
}
HackerRank training-the-army的更多相关文章
- HackerRank "Training the army" - Max Flow
First problem to learn Max Flow. Ford-Fulkerson is a group of algorithms - Dinic is one of it.It is ...
- 2019 Multi-University Training Contest 2 - 1008 - Harmonious Army - 最大流
http://acm.hdu.edu.cn/showproblem.php?pid=6598 一开始就觉得是网络流,但是一直都不会怎么建图. 这里要考虑. 每一组边(u,v,a,b,c)建立如下的连接 ...
- 2019 Multi-University Training Contest 2 Harmonious Army(最小割)
题意:给你n个点 每个点都有两种选择 成为战士或者法师 现在给你m个关系 对应这两个人的对应关系的权值A,B,C 思路:按照下面的思路建图跑最小割(要注意权值要乘2 可能存在不整除的情况) #incl ...
- Gym - 100283F F. Bakkar In The Army —— 二分
题目链接:http://codeforces.com/gym/100283/problem/F F. Bakkar In The Army time limit per test 2 seconds ...
- 2019 Multi-University Training Contest 2
2019 Multi-University Training Contest 2 A. Another Chess Problem B. Beauty Of Unimodal Sequence 题意 ...
- HDU校赛 | 2019 Multi-University Training Contest 2
2019 Multi-University Training Contest 2 http://acm.hdu.edu.cn/contests/contest_show.php?cid=849 100 ...
- hdu 4946 2014 Multi-University Training Contest 8
Area of Mushroom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2016 Multi-University Training Contests
2016 Multi-University Training Contest 1 2016 Multi-University Training Contest 2 2016 Multi-Univers ...
- 2016 Multi-University Training Contest 2 D. Differencia
Differencia Time Limit: 10000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 2016 Multi-University Training Contest 1 G. Rigid Frameworks
Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
随机推荐
- 脚本放在 <body> 元素的底部
建议把脚本放在 <body> 元素的底部. 这会提高网页加载速度,因为 HTML 加载不受制于脚本加载.
- Java中jsp和Servlet的区别
1 Servlet Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面.它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务 ...
- [转]Sql按年份.月份.每天统计数量
1.每年 select year(ordertime) 年, sum(Total) 合计 from 表 group by year(ordertime) 2.每月 select year(ordert ...
- javascript 之Object内置对象
Object.defineProperty(obj, prop, descriptor)
- html页面 代码 编写的 一些 基本素养 约定 知识点
hmtl代码书写也要养成一段一段的 区块代码, 每个区块代码 进行 html的 功能注释 自由文字的获得: (lorem ipsum: 乱数假文, 哑元文字) lorem ipsum: lipsum等 ...
- 从svn检出项目---------不是web项目
javaweb项目从svn检出变成java项目 javaweb项目从svn检出后变成java项目,解决办法是: 1.项目右键–properties–Project Facets,勾选上Dynamic ...
- RTX二次开发(一)(基于ASP.NET)
腾讯通RTX是(Real Time eXpert)是腾讯公司推出的企业级实时通信平台,致力于帮助企业提高运作效率.降低沟通成本.拓展商业机会,是一种高度可管理.低成本.易部署的IT平台.RTX集成了丰 ...
- 利用CSS实现带相同间隔地无缝滚动动画
说明:因为在移动上主要利用CSS来做动画,所以没有考虑其他浏览器的兼容性,只有-webkit这个前缀,如果需要其他浏览器,请自行补齐. 首先解释一下什么是无缝滚动动画, 例如下面的例子 See the ...
- [译]Probable C# 6.0 features illustrated
原文: http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated ========================= ...
- IIS服务器运行一段时间后卡死,且无法打开网站(IIS管理无响应,必须重启电脑)
问题描述: 公司希望使用IIS配合网站显示一些订单跟进的情况并展示出来,所以我们在一台演示的Win7 Pro电脑上安装了IIS,但使用了一段时间后发现每过几天页面就无法正常访问了,而且打开IIS管理器 ...