HackerRank training-the-army

时间:2022-09-12 00:09:19

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的更多相关文章

  1. HackerRank &quot&semi;Training the army&quot&semi; - Max Flow

    First problem to learn Max Flow. Ford-Fulkerson is a group of algorithms - Dinic is one of it.It is ...

  2. 2019 Multi-University Training Contest 2 - 1008 - Harmonious Army - 最大流

    http://acm.hdu.edu.cn/showproblem.php?pid=6598 一开始就觉得是网络流,但是一直都不会怎么建图. 这里要考虑. 每一组边(u,v,a,b,c)建立如下的连接 ...

  3. 2019 Multi-University Training Contest 2 Harmonious Army&lpar;最小割&rpar;

    题意:给你n个点 每个点都有两种选择 成为战士或者法师 现在给你m个关系 对应这两个人的对应关系的权值A,B,C 思路:按照下面的思路建图跑最小割(要注意权值要乘2 可能存在不整除的情况) #incl ...

  4. Gym - 100283F F&period; Bakkar In The Army —— 二分

    题目链接:http://codeforces.com/gym/100283/problem/F F. Bakkar In The Army time limit per test 2 seconds ...

  5. 2019 Multi-University Training Contest 2

    2019 Multi-University Training Contest 2 A. Another Chess Problem B. Beauty Of Unimodal Sequence 题意 ...

  6. HDU校赛 &vert; 2019 Multi-University Training Contest 2

    2019 Multi-University Training Contest 2 http://acm.hdu.edu.cn/contests/contest_show.php?cid=849 100 ...

  7. 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) ...

  8. 2016 Multi-University Training Contests

    2016 Multi-University Training Contest 1 2016 Multi-University Training Contest 2 2016 Multi-Univers ...

  9. 2016 Multi-University Training Contest 2 D&period; Differencia

    Differencia Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  10. 2016 Multi-University Training Contest 1 G&period; Rigid Frameworks

    Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

随机推荐

  1. MS-sqlserver数据库2008如何转换成2000

    http://bbs.csdn.net/topics/390438560?page=1#post-394316973 MS-sqlserver数据库2008如何转换成2000 回你这个贴等于我写个博客 ...

  2. 06socket编程

    socket可以看成是用户进程与内核网络协议栈的编程接口. socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信. IPv4套接口地址结构通常也称为“网际套接字地址结构”,它 ...

  3. hibernate的formula如何使用

    之前用过hibernate的formula记得很好用,但是这次用到想不起来怎么用了,结果去网上查结果发现大多都是无用信息. 最终搞定了,还是在这里记录一下,省的忘记. 我用formula的目的在于字典 ...

  4. nginx-push-stream模块源码学习(二)——模块初始化

    本文重点介绍push stream模块的构成,至于nginx如何启动.维护该模块不会详细阐述,以后有时间会做详细阐述. 一.模块定义 1.1.  模块配置 通用nginx模块的配置struct有三种, ...

  5. tamcat的使用

    tomcat的基础知识 一.tomcat的定义 apache的官网是这么说的:使用Apache Tomcat ®软件了Java Servlet,JavaServer页,Java表达式语言和Java的W ...

  6. python数据类型——列表和元组类型

    列表类型(list) 定义一个列表类型很简单: l = ['a','b','c','d','e','f'] 变量l即为列表类型,可以用type方法查看: print(type(l)) 列表的增删改查 ...

  7. 主席树&lbrack;可持久化线段树&rsqb;&lpar;hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F&colon;Pathwalks &rpar;

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...

  8. Confluence 6 修改警告的阈值和表现

    修改警告的阈值 一些警告的阈值是可以被配置的.如果你发现一些阈值很容易就触发警告了,你可以对这些阈值进行调整让你的系统警告不容易被触发. 访问 Recognized System Properties ...

  9. iOS 不能加载电子签名

    问题: 1:使用WKWebView在iOS12.0以上的系统中,可以显示PDF中的电子图章,签名.在iOS12.0以下的系统中不能显示电子签名,图章. 2:  解决方案,使用PDF.js加载. pdf ...

  10. python属性查找 深入理解(attribute lookup)

    在Python中,属性查找(attribute lookup)是比较复杂的,特别是涉及到描述符descriptor的时候. 在上一文章末尾,给出了一段代码,就涉及到descriptor与attribu ...