题面

思路

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

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

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

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. LeetCode-177:第N高的薪水

    第N高的薪水与第二高的薪水,解题思路是一样的,只要对LeetCode-176的SQL做一下变形,便可以满足这题,详见:https://www.cnblogs.com/zouqf/p/10282392. ...

  2. Springcloud Eureka 启动失败:ERROR org.springframework.boot.SpringApplication - Application run failed

    在测试Euruka作为服务注册中心的时候碰到了这个问题 [main] ERROR org.springframework.boot.SpringApplication - Application ru ...

  3. centos 7忘记了root密码,如何改密码?

    今天服务器突然进不去了,不知道是密码被改了,还是什么情况! 服务器版本:centos 7.0 网上查找了很多文档,有些办法不可行,如果是亲自试过绝对可行的方法: 1:重启服务器,如下界面,按键盘 &q ...

  4. 彻底搞定C指针--“函数名与函数指针”

    函数名与函数指针   一 通常的函数调用 一个通常的函数调用的例子: //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); 点击打开链 ...

  5. 【CSS】多行溢出显示省略号

    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3;//超出三行隐藏 overflow: hidden; ...

  6. Oauth2.0协议 http://www.php20.com/forum.php?mod=viewthread&tid=28 (出处: 码农之家)

    概要     OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0. OAuth 2.0关注客户端开发者的简易性.要么通过组织在资源拥有者和HTTP服 ...

  7. Deepin15.7 更改软件的jdk

    最近更新了系统,发现smartsvn.smartgit.Dbeaver都无法打开了,上网googlel一下,发现是java9的问题,需要把软件的java版本更改一下就可以了 先上jdk的位置 一.sm ...

  8. thinkphp5控制器向+vue的data里传值

    传一维数组传值 $array=['id'=>40,"cat_name"=>"明星产品"]; $MenuCats_info=json_encode($ ...

  9. 笔记-python-lib-requests常用类/方法/属性

    笔记-python-lib-requests常用类/方法/属性 1.      requests模块常用类/方法/属性 在使用中发现对requests模块不够熟悉,写了几个案例后重新整理了一下文档,罗 ...

  10. 笔记-git-协作开发

    笔记-git-协作开发 1.      git协作开发 git协作的典型做法是,创建一个git服务器,被多个人操作. 示意图如下: 一般来说协作分为如下几个步骤: 创建一个git裸服务器 (git i ...