[codeforces 508E]Maximum Matching
题目:Maximum Matching
传送门:http://codeforces.com/contest/1038/problem/E
分析:
一个块拥有{color1,val,color2},两个块相连要求相连处颜色相同,求价值最大的连接方案。
关心到color最大为4,以4种颜色为点,对于每个块,在(color1,color2)间连一条边权为(val)的边,建一张4个点n条边的图。显然,在图上选一条价值最大的路径(或回路)就是答案了。
方法一:
如果这张图本身就是Eular路径(或Eular回路),那就是答案了,不会有方案比全选更优。
如果本身不是Eular路径(或Eular回路),我们可以删掉一些边,使其成为Eular路径(或Eular环路)。
对于两个点而言,最多删去一条边(若删去两条,这两条构成的环可加入答案),删去的边一定是连接这两个点的边中权重最小的。
枚举要删掉的边,对于4个点,两两连接,最多16条边需要考虑是否删除,枚举删掉边的集合st(对该集合状态压缩),对去除该集合中的边的集合求一条Eular路径(或Eular回路)
复杂度:$O(2^16 * 4 * 4 * n)$ 实际上对存在自环的集合是不用考虑的,复杂度:$O(2^16 * n)$
引用:Ashishgup大佬的题解:http://codeforces.com/blog/entry/61692
方法二:
如果两点(u,v)之间存在多条边,每两条边就能走回本身,可从原图中消去,在遍历到u点或v点时加到答案中,注意不要重复加。
为了保证不破坏原图的连通性,那最多只需保留2条边,保留的当然是权值最小的边啦(这些边有可能不被选中,保留权值大的边就可能得不到答案)
对4个点13条边暴力DFS找一条路径即可。这样复杂度与n无关,题目的n可以进一步加强。
#include <bits/stdc++.h>
int e[][][],f[][],vis[];
int ans=;
void dfs(int x,int tmp){
for(int y=;y<=;++y)if(!vis[x] && !vis[y])tmp+=f[x][y];++vis[x];
if(tmp>ans)ans=tmp;
for(int y=;y<=;++y)
if(x!=y && e[x][y][]>){
tmp+=e[x][y][e[x][y][]];
--e[x][y][];--e[y][x][];
dfs(y,tmp);
++e[x][y][];++e[y][x][];
tmp-=e[x][y][e[x][y][]];
}
--vis[x];for(int y=;y<=;++y)if(!vis[x] && !vis[y])tmp-=f[x][y];
}
int main(){
//freopen("in.txt","r",stdin);
int n;scanf("%d",&n);
for(int i=,u,val,v;i<n;++i){
scanf("%d %d %d",&u,&val,&v);
if(v>u)u^=v,v^=u,u^=v;
e[v][u][++e[v][u][]]=val;
}
for(int i=;i<=;++i){
for(;e[i][i][];--e[i][i][])f[i][i]+=e[i][i][e[i][i][]];
for(int j=i+;j<=;++j){
std::sort(e[i][j]+,e[i][j]+e[i][j][]+);
for(;e[i][j][]>;e[i][j][]-=)f[i][j]+=e[i][j][e[i][j][]]+e[i][j][e[i][j][]-];
e[j][i][]=e[i][j][];e[j][i][]=e[i][j][];e[j][i][]=e[i][j][];
f[j][i]=f[i][j];
}
}
dfs(,);
for(int i=;i<=;++i)
dfs(i,);
printf("%d",ans);
return ;
}
方法3:
我们可以设计一个复杂度与n相关的做法,这样颜色数量可以加强。
定义f[i][j][x][y]:[i,j]区间里的链左右端点颜色为(x,y);
转移方程:
1继承:f[i][j][x][y]: max{f[i][k][x][y],f[k+1][j][x][y]};
2拼接:f[i][j][x][y]: max{f[i][k][x][t]+f[k+1][j][t][y], f[k+1][j][x][t]+f[i][k][t][y]};
引用:http://codeforces.com/contest/1038/submission/42602607
方法4:
对于本题而言,在连通块中,每当找到一个环就可以直接加入到答案中。最后可能会剩下一些零星的边,对于只有4个点的图而言的,只有剩下$e_{a,b},e_{c,d}$这种情况要考虑,删除一条就好了,可以从加入答案的边中用权值最小的边替换剩下的边,删掉。等效于删去一条最小边。
找环(实际上不关心环的具体情况,与找Eular路径(回路)方法相同,使用Fleury算法,复杂度O(n))
联通块可用并查集维护。
引用:http://codeforces.com/contest/1038/submission/42587804
[codeforces 508E]Maximum Matching的更多相关文章
- [Codeforces Round #508 (Div. 2)][Codeforces 1038E. Maximum Matching]
前几天给舍友讲这题的时候感觉挺有意思的,就贴上来吧... 题目链接:1038E - Maximum Matching 题目大意:有\(n\)个棒子,每个条两端有颜色\(c1,c2\)以及他的价值\(v ...
- Codeforces 1038E Maximum Matching
可能写了个假算法 假设定义:含有一个欧拉路的图为类欧拉图 欧拉路的定义:一个无向连通图中,存在一条路径对所有边都遍历且仅遍历一次:判断方法:该连通图中度为奇数的点的个数不能超过2,即为0或者2 题目解 ...
- Codeforces Round #508 (Div. 2) E. Maximum Matching(欧拉路径)
E. Maximum Matching 题目链接:https://codeforces.com/contest/1038/problem/E 题意: 给出n个项链,每条项链左边和右边都有一种颜色(范 ...
- Codeforces 1038 E - Maximum Matching
E - Maximum Matching 思路: 欧拉图 定理:一个度数为奇数的点的个数小于等于2的联通图存在欧拉回路 对于这道题目的图,点的个数为4,所以最坏的情况下4个点的度数都为奇数,在这种情况 ...
- Codeforces 484B Maximum Value(高效+二分)
题目链接:Codeforces 484B Maximum Value 题目大意:给定一个序列,找到连个数ai和aj,ai%aj尽量大,而且ai≥aj 解题思路:类似于素数筛选法的方式,每次枚举aj,然 ...
- Codeforces C. Maximum Value(枚举二分)
题目描述: Maximum Value time limit per test 1 second memory limit per test 256 megabytes input standard ...
- codeforces B.Maximum Absurdity 解题报告
题目链接:http://codeforces.com/contest/332/problem/B 题意:在一个序列中,在所有长度为k的区间里找出两个不重叠的最大和,输出这两个最大和所对应的开头的位置a ...
- Codeforces 484B Maximum Value(排序+二分)
题目链接: http://codeforces.com/problemset/problem/484/B 题意: 求a[i]%a[j] (a[i]>a[j])的余数的最大值 分析: 要求余数的最 ...
- Codeforces 888E Maximum Subsequence
原题传送门 E. Maximum Subsequence time limit per test 1 second memory limit per test 256 megabytes input ...
随机推荐
- pandas向左移动非空单元格
碰到个小问题, 因为需要更改excel 的行为. 处理最多的还是excel的事, 不过看起来是excel.实际上对pandas 的库的熟悉.读取,更改,应用等等,方法. 十分有用. 先说需求,本来的表 ...
- 【FICO系列】SAP FICO模块-财务账期的打开和关闭
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP FICO模块-财务账期的 ...
- Java程序流程控制
程序流程控制有 选择,循环,以及跳转结构 选择结构中无非就是 If 和 switch语句我两种都做了一些小案例 1. 利用Scanner库来获得控制台用户输入的数字与代码中定义的变量比较 packag ...
- java虚拟机笔记-1
java虚拟机学习笔记 Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行.Java程序的运行需要Java虚拟机.Java API和Java Class文件的配合.Java虚 ...
- CSS动画划入划出酷炫
HTML插入 <!DOCTYPE html> <html class="no-js iarouse"> <head> <meta char ...
- 并行开发 1.Parallel
原文:8天玩转并行开发——第一天 Parallel的使用 随着多核时代的到来,并行开发越来越展示出它的强大威力,像我们这样的码农再也不用过多的关注底层线程的实现和手工控制, 要了解并行开发,需要先了解 ...
- elasticsearch 基础 —— Update API
Update API 更新API允许基于提供的脚本更新文档.该操作从索引获取文档(与分片并置),运行脚本(使用可选的脚本语言和参数),并对结果进行索引(也允许删除或忽略操作).它使用版本控制来确保在& ...
- YouCompleteMe报错可能是第三方库没有
git submodule update --init --recursive 到YouCompleteMe安装目录下,执行上面的命令
- 【LeetCode】链表 linked list(共34题)
[2]Add Two Numbers (2018年11月30日,第一次review,ko) 两个链表,代表两个整数的逆序,返回一个链表,代表两个整数相加和的逆序. Example: Input: ( ...
- css解决表格嵌套表格出现多余边框的方法
这是昨天遇到的问题因为表格里面套了层表格出现了双层的边框,昨天折腾了很久最终才知道有个属性叫 border-style:hidden 可以解决边框冲突! 左边的边框加上了该属性之后