[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 ...
随机推荐
- c++内存布局与c程序的内存布局
c/c++的内存布局:堆,栈,自由存储区(与堆的区别),全局/静态存储区,常量存储区(字符串常量,const常量) http://www.cnblogs.com/QG-whz/p/5060894.ht ...
- 【Unity练习】 平衡球Demo
链接:http://pan.baidu.com/s/1pKEpnIz 密码:btke
- crontab自动执行任务,失败原因记录
服务器上使用crontab部署这两个每分钟自动执行的命令.首先,这两个命令是之前的人部署的,在我接手之前,就一直在了的.根据命令,实际上应该是做到每分钟都执行一次脚本.但是实际操作中,却发现,其实并没 ...
- JavaScript 高级程序设计(第3版)第二章 (在html中使用js)
1.script元素的属性(6个):①async(异步脚本),只对外部脚本有效 ②defer(延迟脚本),只对外部脚本有效 ③charset,src(可跨域),type,language 2.尽可能使 ...
- oracle函数与存储方法
oracle中的函数, 可以理解为java中的方法 有参数, 或者没有参数 通过return返回一个值 oracle存储过程跟函数唯一的区别, 存储过程不能通过return返回一个值 参数的类型, i ...
- [Python3 填坑] 014 类的常用魔术方法举例
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 __init__() 2.2 __new__() 2.3 __call__() 2.4 __str__() 2.5 __repr__() ...
- bootstrap-select、datatables插件使用
1.引入样式文件 <%--引入bootstrap_select样式--%> <link rel="stylesheet" type="text/css& ...
- Link-Cut-Tree学习(LCT)
Link-Cut-Tree学习(LCT) 真不敢想象我居然学会LCT了,但是我仍然不想写一篇博客来梳理 我怕一梳理自己又不懂了 但是作为一名朴实沉毅的cjoier,我决定小小的梳理一下,并不打算很精致 ...
- 使用Anaconda3安装tensorflow,opencv,使其可以在spyder中运行
使用Anaconda5.0.0 1.首选无论你是在cmd键入python,还是在Anaconda Prompt键入python,显示的都是Python3.6.然而在Spyder(tensorflow) ...
- 通用的规则匹配算法(原创)(java+.net)
1.java里可以使用Spring的 Spel或者Google的Aviator 如果使用 Aviator 则添加以下依赖 <dependency> <groupId>com.g ...