题面

思路

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

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

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

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. 解决nsis error!cant initialize plug-ins directory.please try again later

    情况1: 调用SectionEnd会释放掉dll初始化标记,所有Section都必须放在函数的最下面. 情况2: 有可能是栈里的数据错乱,特别注意的是,使用BgWorker.dll获取多线程能力的时候 ...

  2. 【iOS】史上最全的iOS持续集成教程 (上)

    :first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...

  3. ES6初识-(冲突)数据结构

    Set的用法 元素不能重复--唯一性 WeakSet key值只能是对象 没有clear属性 Map let map=new Map([['a',123],['b',456]]);; WeakMap ...

  4. git 常用命令及仓库创建

    一.常用命令 1.添加到本地仓库缓存 git add . 2.查看本地仓库状态 git status 3.提交到本地仓库 git commit -am 'project init' 4.连接线上分支 ...

  5. VMware运行时“内部错误”的解决方法

    解决方法:打开虚拟机实体目录,如下:发现有两个虚拟机配置文件,一个文件大小为4KB,另一个为空.现在虚拟机默认使用为空的配置文件了. 将大小为空的虚拟机配置文件删除掉,然后将另一个配置文件重名命. 接 ...

  6. java.lang.UnsupportedOperationException 原因以及解决方案

    如下代码: Map[] cardProds = JsonUtils.getObject(oldCartValue, new TypeReference<Map[]>(){}); List& ...

  7. iPhone 横屏时默认会放大文字的问题

    有人说用 html { text-size-adjust: 100%; }我发现这个并不能解决问题.下面代码可以完美解决. 添加标签:<meta name="viewport" ...

  8. dts--tests(四)

    unit_tests.py """ DPDK Test suite. This TestSuite runs the unit tests included in DPD ...

  9. Flask初学者:蓝图Blueprint

    蓝图这个名字好像就是根据单词Blueprint字面意思来,跟平常我们理解的蓝图完全挂不上钩,这里蓝图就是指Blueprint. 使用蓝图的好处是可以将不同功能作用的视图函数/类视图放到不同的模块中,可 ...

  10. 深度学习 GPU环境 Ubuntu 16.04 + Nvidia GTX 1080 + Python 3.6 + CUDA 9.0 + cuDNN 7.1 + TensorFlow 1.6 环境配置

    本节详细说明一下深度学习环境配置,Ubuntu 16.04 + Nvidia GTX 1080 + Python 3.6 + CUDA 9.0 + cuDNN 7.1 + TensorFlow 1.6 ...