题面

思路

其实仔细读透就发现,是一个最大权闭合子图的模型

套进网络流里面就挺好做的了

可以选择重载这道题里面的一些运算(加减,取最小值),这样比较方便

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read(){
int re=0,flag=1;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') flag=-1;
ch=getchar();
}
while(isdigit(ch)) re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return re*flag;
}
int n,m,tote,cnte=-1,first[10010],dep[10010],cur[10010];
struct rsc{//rsc就是resource的意思啦
int a[10];
rsc(){memset(a,0,sizeof(a));}
inline bool operator<(const rsc b){
for(int i=1;i<=m;i++) if(a[i]!=b.a[i]) return a[i]<b.a[i];
return 0;
}
inline rsc operator+(const rsc b){
rsc re;
for(int i=1;i<=m;i++) re.a[i]=a[i]+b.a[i];
return re;
}
inline rsc operator-(const rsc b){
rsc re;
for(int i=1;i<=m;i++) re.a[i]=a[i]-b.a[i];
return re;
}
inline bool zero(){
for(int i=1;i<=m;i++) if(a[i]!=0) return 0;
return 1;
}
};
rsc INF,zero;
struct edge{
int to,next;
rsc w;
}a[200010];
inline void add(int u,int v,rsc adde){
cnte++;a[cnte].to=v;a[cnte].next=first[u];a[cnte].w=adde;first[u]=cnte;
cnte++;a[cnte].to=u;a[cnte].next=first[v];a[cnte].w=zero;first[v]=cnte;
}
bool bfs(int s,int t){
int q[10010],head=0,tail=1,i,u,v;
memset(dep,-1,sizeof(dep));
for(i=0;i<=n+1;i++) cur[i]=first[i];
q[0]=s;dep[s]=0;
while(head<tail){
u=q[head++];
for(i=first[u];~i;i=a[i].next){
v=a[i].to;
if(~dep[v]||a[i].w.zero()) continue;
dep[v]=dep[u]+1;q[tail++]=v;
}
}
return ~dep[t];
}
rsc min(rsc l,rsc r){
return ((l<r)?l:r);
}
rsc dfs(int u,int t,rsc lim){
if(u==t||lim.zero()) return lim;
int i,v;rsc f,flow=zero;
for(i=cur[u];~i;i=a[i].next){
v=a[i].to;cur[u]=i;
if(dep[v]!=dep[u]+1) continue;//这个地方注意要先判,否则要是先下一句话的话就会无限循环了(其实这个主要是我的写法的锅)
f=dfs(v,t,min(a[i].w,lim));
if(!f.zero()){
a[i].w=(a[i].w-f);a[i^1].w=(a[i^1].w+f);
flow=(flow+f);lim=(lim-f);
if(lim.zero()) return flow;
}
}
return flow;
}
rsc dinic(int s,int t){
rsc re;
while(bfs(s,t)) re=(re+dfs(s,t,INF));
return re;
}
int main(){
memset(first,-1,sizeof(first));
cnte=-1;
int i,j,t1,t2;
rsc tmp,re;
char s[10];
n=read();tote=read();m=read(); for(i=1;i<=m;i++) INF.a[i]=1e9;
for(i=1;i<=n;i++){
scanf("%s",s);
memset(tmp.a,0,sizeof(tmp.a));
for(j=0;j<m;j++){
if(s[j]=='+') tmp.a[j+1]=1;
if(s[j]=='-') tmp.a[j+1]=-1;
}
if(tmp<zero){
for(j=1;j<=m;j++) tmp.a[j]=-tmp.a[j];
add(i,n+1,tmp);
}
else add(0,i,tmp),re=(re+tmp);
}
for(i=1;i<=tote;i++){
t1=read();t2=read();
add(t1,t2,INF);
}
tmp=dinic(0,n+1);
for(i=1;i<=m;i++) printf("%d ",re.a[i]-tmp.a[i]+1000);
}

task [最大权闭合子图]的更多相关文章

  1. BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...

  2. HDU 3879 Base Station(最大权闭合子图)

    经典例题,好像说可以转化成maxflow(n,n+m),暂时只可以勉强理解maxflow(n+m,n+m)的做法. 题意:输入n个点,m条边的无向图.点权为负,边权为正,点权为代价,边权为获益,输出最 ...

  3. [BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以 ...

  4. HDU4971 A simple brute force problem.(强连通分量缩点 + 最大权闭合子图)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4971 Description There's a company with several ...

  5. HDU5855 Less Time, More profit(最大权闭合子图)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5855 Description The city planners plan to build ...

  6. HDU5772 String problem(最大权闭合子图)

    题目..说了很多东西 官方题解是这么说的: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得分) 第二类:原串中的n个点每个 ...

  7. SCU3109 Space flight(最大权闭合子图)

    嗯,裸的最大权闭合子图. #include<cstdio> #include<cstring> #include<queue> #include<algori ...

  8. hiho 第119周 最大权闭合子图

    描述 周末,小Hi和小Ho所在的班级决定举行一些班级建设活动. 根据周内的调查结果,小Hi和小Ho一共列出了N项不同的活动(编号1..N),第i项活动能够产生a[i]的活跃值. 班级一共有M名学生(编 ...

  9. [HIHO119]网络流五·最大权闭合子图(最大流)

    题目链接:http://hihocoder.com/contest/hiho119/problem/1 题意:中文题意. 由于1≤N≤200,1≤M≤200.最极端情况就是中间所有边都是满的,一共有N ...

随机推荐

  1. react的 react-router使用

    官方API:https://reacttraining.com/react-router/web/api/BrowserRouter; React Router 安装命令如下. 使用时,路由器Rout ...

  2. 介绍hadoop中的hadoop和hdfs命令

    有些hive安装文档提到了hdfs dfs -mkdir ,也就是说hdfs也是可以用的,但在2.8.0中已经不那么处理了,之所以还可以使用,是为了向下兼容. 本文简要介绍一下有关的命令,以便对had ...

  3. 转:SpringCloud服务注册中心比较:Consul vs Zookeeper vs Etcd vs Eureka

    原文链接地址:http://luyiisme.github.io/2017/04/22/spring-cloud-service-discovery-products/ 这里就平时经常用到的服务发现的 ...

  4. Java - 得到项目中properties属性文件中定义的属性值

    public static String getPropertiesValue(String fileName, String key) {   return ResourceBundle.getBu ...

  5. 浅谈PHP中的数组和JS中的数组

    最近在做前后端对接的时候,遇到一个问题,前端要求返回的数据格式是左边的,但是我通过json_encode返回到的数据格式是右边的   注意:数据格式从"[]"(数组)变成了&quo ...

  6. 汇编:1位16进制数到ASCII码转换

    ;============================ ;1位16进制数到ASCII码转换 ; { X+30H (0≤X≤9) ;Y= { ; { X+37H (0AH≤X≤0FH) DATAS ...

  7. 关于移动端video标签层级问题

    这是在微信中正常页面,就是用了一个原生video标签没做任何处理.然后顶部是固定页面顶端的,这个时候向上滑动页面时,会出现下图现象 这个时候正常人都会想到z-index问题,我也是这样想的,可惜很抱歉 ...

  8. yii2深入理解之内核解析

    一.前言 首先,yii2最为为数不多的PHP主流开源框架,受欢迎程度不亚于laravel和TP.个人认为,研究这些框架底层代码是非常有助于自身代码编程思想的提升和代码简化程度和质量的提升的. 那么,话 ...

  9. caioj:1348: [NOIP普及组2012]质因数分解 C++

    题目描述 已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数. 输入样例 21 输出样例 7 输入 输入只有一行,包含一个正整数n. 输出 输出只有一行,包含一个正整数p,即较大的那个质数 ...

  10. POJ 2079 最大三角形面积(凸包)

    Triangle Description Given n distinct points on a plane, your task is to find the triangle that have ...