SCU 4442 party 二分图最大点权独立集
每个青蛙喝黑茶或者红茶或者都可以喝
M个矛盾关系 有矛盾的不能喝同种茶 但你可以花费Wi使得这个青蛙消除所有矛盾 把矛盾当作边 青蛙当作点 如果这两个青蛙只喝不同的一种茶就不建边
题目中保证了不存在奇环 可以黑白染色成二分图
然后把两个茶都可以喝的青蛙拆点 u表示该青蛙喝黑茶 u+n表示喝红茶 同时建边(u,u+n)
有四种情况:
1.两个青蛙都可以喝两种茶 建边(u,v) (u+n,v+n)
2.两个青蛙一个可以喝两种茶 一个可以喝黑茶 建边(u,v)
3.两个青蛙一个可以喝两种茶 一个可以喝红茶 建边(u,v+n)
4.两种青蛙都只能喝一种茶 建边(u,v)
然后黑白染色成二分图连S,T 跑二分图最小点权覆盖集
最后跑出来的答案要减去sumw 因为两种茶都可以喝的青蛙拆点导致每次拆点多花费了Wi
#include<bits/stdc++.h>
using namespace std;
const int MAXN = ;
const int MAXM = ;
const int INF = ;
int Head[MAXN], cur[MAXN], lev[MAXN], to[MAXM << ], nxt[MAXM << ], f[MAXM << ], ed, S, T;
int n, m;
inline void addedge(int u, int v, int cap) {
to[++ed] = v;
nxt[ed] = Head[u];
Head[u] = ed;
f[ed] = cap;
to[++ed] = u;
nxt[ed] = Head[v];
Head[v] = ed;
f[ed] = ;
return ;
}
inline bool BFS() {
int u;
memset(lev, -, sizeof(lev));
queue<int> q;
lev[S] = ;
q.push(S);
while (q.size()) {
u = q.front();
q.pop();
for (int i = Head[u]; i; i = nxt[i]) {
if (f[i] && lev[to[i]] == -) {
lev[to[i]] = lev[u] + ;
q.push(to[i]);
}
}
}
memcpy(cur, Head, sizeof(Head));
return lev[T] != -;
}
inline int DFS(int u, int maxf) {
if (u == T || !maxf) {
return maxf;
}
int cnt = ;
for (int &i = cur[u], tem; i; i = nxt[i]) {
if (f[i] && lev[to[i]] == lev[u] + ) {
tem = DFS(to[i], min(maxf, f[i]));
maxf -= tem;
f[i] -= tem;
f[i ^ ] += tem;
cnt += tem;
if (!maxf) {
break;
}
}
}
if (!cnt) {
lev[u] = -;
}
return cnt;
}
int Dinic() {
int ans = ;
while (BFS()) {
ans += DFS(S, );
}
return ans;
}
void init(int SS, int TT) {
memset(Head, , sizeof(Head));
ed = ;
S = SS, T = TT;
return ;
}
struct node {
int kind;
int id;
int l, r;
int w;
} frog[];
vector<int> g[ * MAXN];
int color[ * MAXN];
int sumw;
void dfs(int x, int pre) {
for (int v : g[x]) {
if (v == pre || color[v] != -) {
continue;
}
color[v] = color[x] ^ ;
dfs(v, x);
}
}
inline void add(int u, int v) {
g[u].push_back(v);
g[v].push_back(u);
}
int main() {
int u, v;
while (scanf("%d %d", &n, &m) != -) {
sumw = ;
for (int i = ; i <= * n; i++) {
color[i] = -;
g[i].clear();
}
for (int i = ; i <= n; i++) {
scanf("%d", &frog[i].w);
}
for (int i = ; i <= n; i++) {
scanf("%d", &frog[i].kind);
if (frog[i].kind == ) {
sumw += frog[i].w;
add(i, i + n);
}
}
for (int i = ; i <= m; i++) {
scanf("%d %d", &u, &v);
if (frog[u].kind + frog[v].kind == ) {
continue;
}
if (frog[u].kind > frog[v].kind) {
swap(u, v);
}
if (frog[u].kind != ) {
if (frog[v].kind != ) {
add(u, v);
} else {
if (frog[u].kind == ) {
add(u, v);
} else {
add(u, v + n);
}
}
} else {
add(u, v);
add(u + n, v + n);
}
}
for (int i = ; i <= * n; i++) {
if (color[i] == -) {
color[i] = ;
dfs(i, -);
}
}
init(, * n + );
for (int i = ; i <= * n; i++) {
int wnow;
if (i > n) {
wnow = frog[i - n].w;
} else {
wnow = frog[i].w;
}
if (color[i] == ) {
addedge(S, i, wnow);
} else {
addedge(i, T, wnow);
}
}
for (int i = ; i <= * n; i++) {
if (color[i] == ) {
for (int v : g[i]) {
addedge(i, v, INF);
}
}
}
int anser = Dinic();
anser -= sumw;
printf("%d\n", anser);
}
return ;
}
SCU 4442 party 二分图最大点权独立集的更多相关文章
- SCU3185 Black and white(二分图最大点权独立集)
题目大概说有几个黑色.白色矩阵,问能选出黑白不相交的矩形面积和的最大值. 建二分图,黑色矩阵为X部的点,白色为Y部,XY的点权都为其矩阵面积,如果有个黑白矩阵相交则它们之间有一条边,那样问题就是要从这 ...
- BZOJ 1475 方格取数(二分图最大点权独立集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1475 [题目大意] 给出一个n*n的方格,从中取一些不相邻的数字,使得和最大 [题解] ...
- zoj 3165 (最小割,最大点权独立集)
胡伯涛的<最小割模型在信息学竞赛中的应用>写的真牛. 这道题是选择一些男孩和女孩参加party,邀请的男孩女孩之间不能有 8g,图就是个明显的二分图,就是选择一些点之间没有8g关系,就是二 ...
- 【最大点权独立集】【HDU1565】【方格取数】
题目大意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. 初看: 没想法 ...
- hdu 1565&&hdu 1569 (最大点权独立集)
题目意思很明确就是选一些没有相连的数字,使和最大,建成二分图后求最大点权独立集,, #include<stdio.h> #include<string.h> const int ...
- LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流
#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- 最小点权覆盖集&最大点权独立集
最小点权覆盖集 二分图最小点权覆盖集解决的是这样一个问题: 在二分图中,对于每条边,两个端点至少选一个,求所选取的点最小权值和. 方法: 1.先对图二分染色,对于每条边两端点的颜色不同 2.然后建立源 ...
- HDU1569 最大流(最大点权独立集)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)
/** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...
随机推荐
- Map对象,Set对象使用(2)
今天重点见一下Set Set 在我印象里它主要就是去重,Set 是一个值的集合,这个集合中所有的值仅出现一次 Set 属性size:和Map的size一样,返回成员的总数 Set的方法: Set.pr ...
- 启动Nginx 出现 nginx: [emerg] unknown directive "锘?user" 错误
出现这种情况 一般是修改配置文件 nginx.conf 造成的 如果你修改文件后出现 那基本上就是这个原因 启动不了 重新打开 改为UTF-8 无BOM编码
- C#实现隐藏手机号、邮箱、姓名等敏感信息扩展方法
还是老惯例,直接上代码. 最终效果图: public static class HideSensitiveInfoExtension { /// <summary> /// 隐藏敏感信息 ...
- 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧
目录 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧 25.1 Shell中的色彩处理 25.2 awk基本应用 25.2.1 概念 25.2.2实例演示 25.3 awk ...
- vscode 安装一些快捷配置
Visual Studio Code 最好的功能.插件和设置 小编推荐:掘金是一个高质量的技术社区,从 ECMAScript 6 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技 ...
- IDEA下tomcat启动后 server乱码,Tomcat Catalina Log乱码问题的解决
如果你初接触Idea,一定会遇到控制台乱码的问题,这里和eclipse有点不一样,看如下办法: 乱码的根本原因:Windows系统的cmd是GBK编码的,所以IDEA的下方log输出的部分的编码也是G ...
- Simple Library Management System HDU - 1497(图书管理系统)
Problem Description After AC all the hardest problems in the world , the ACboy 8006 now has nothing ...
- 恩佐夫博弈+JAVA大数
题意:http://acm.hdu.edu.cn/showproblem.php?pid=5973 根号5复制后200位就行了,因为BigDecimal不支持开根号,除法二分开根. import ja ...
- golang随机数及pipe
var pipe1 = make(chan int, 1000) func piTest(){ for{ data := <- pipe1 fmt.Printf("get data:% ...
- nginx反向代理服务器以及负载均衡,从安装到配置
nginx的具体作用不用细说,很强大,做负载均衡.反向代理服务器解决前端跨域问题等等.下面是nginx的安装过程 首先nginx主要的依赖: pcre. pcre-devel zlib zlib-de ...