task [最大权闭合子图]
题面
思路
其实仔细读透就发现,是一个最大权闭合子图的模型
套进网络流里面就挺好做的了
可以选择重载这道题里面的一些运算(加减,取最小值),这样比较方便
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 [最大权闭合子图]的更多相关文章
- BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...
- HDU 3879 Base Station(最大权闭合子图)
经典例题,好像说可以转化成maxflow(n,n+m),暂时只可以勉强理解maxflow(n+m,n+m)的做法. 题意:输入n个点,m条边的无向图.点权为负,边权为正,点权为代价,边权为获益,输出最 ...
- [BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以 ...
- HDU4971 A simple brute force problem.(强连通分量缩点 + 最大权闭合子图)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4971 Description There's a company with several ...
- HDU5855 Less Time, More profit(最大权闭合子图)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5855 Description The city planners plan to build ...
- HDU5772 String problem(最大权闭合子图)
题目..说了很多东西 官方题解是这么说的: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得分) 第二类:原串中的n个点每个 ...
- SCU3109 Space flight(最大权闭合子图)
嗯,裸的最大权闭合子图. #include<cstdio> #include<cstring> #include<queue> #include<algori ...
- hiho 第119周 最大权闭合子图
描述 周末,小Hi和小Ho所在的班级决定举行一些班级建设活动. 根据周内的调查结果,小Hi和小Ho一共列出了N项不同的活动(编号1..N),第i项活动能够产生a[i]的活跃值. 班级一共有M名学生(编 ...
- [HIHO119]网络流五·最大权闭合子图(最大流)
题目链接:http://hihocoder.com/contest/hiho119/problem/1 题意:中文题意. 由于1≤N≤200,1≤M≤200.最极端情况就是中间所有边都是满的,一共有N ...
随机推荐
- Centos7下MySql5.7安装及配置
安装MySql 软件包: mysql-community-libs-5.7.22-1.el7.x86_64.rpm mysql-community-common-5.7.22-1.el7.x86_64 ...
- table选项卡
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 【js】【读书笔记】廖雪峰的js教程读书笔记
最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...
- 子查询,用户管理,pymysql使用
当我们的一条记录 分散不同的表中时,就需要进行多表查询例如 一对一 一对多 多对多 1.笛卡尔积查询 意思就是将两个表中的所有数据 全部关联在一起例如A表有两条 B表有三条 一共有6条会产生大量的错误 ...
- Mybatis中updateByPrimaryKeySelective和updateByPrimaryKey区别
int updateByPrimaryKeySelective(TbItem record); int updateByPrimaryKey(TbItem record); 上面的是逆转工程生成的Ma ...
- Leetcode 606. 根据二叉树创建字符串
题目链接 https://leetcode.com/problems/construct-string-from-binary-tree/description/ 题目描述 你需要采用前序遍历的方式, ...
- perl语言入门总结-第3章-列表与数组
1-列表list指的是标题的有序集合, 而数组(array)则是存储列表的变量. 更精确地说,列表指的是数据,而数组指的是变量. 访问数组中的元素 ] = "yabba"; ] = ...
- 使用dataframe解决spark TopN问题:分组、排序、取TopN和join相关问题
package com.profile.mainimport org.apache.spark.sql.expressions.Windowimport org.apache.spark.sql.fu ...
- 20145202 《信息安全系统设计基础》git安装
git的安装 直接输入指令将其安装就可以了. 安装的时候要设置公钥,我不知道以前在windows上设置过的公钥是否还能用所以我就还是从新搞了一个. 验证可以连通 遇到的问题
- PHP.32-TP框架商城应用实例-后台8-商品相册-添加
商品相册[是商品的其他相片] 添加相册需求: 每张图片生成三张缩略图{50*50.350*350.650*650} 1.建表p39_goods_pic{id,pic,sm_pic,mid_pic,bi ...