题目: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的更多相关文章

  1. [Codeforces Round #508 (Div. 2)][Codeforces 1038E. Maximum Matching]

    前几天给舍友讲这题的时候感觉挺有意思的,就贴上来吧... 题目链接:1038E - Maximum Matching 题目大意:有\(n\)个棒子,每个条两端有颜色\(c1,c2\)以及他的价值\(v ...

  2. Codeforces 1038E Maximum Matching

    可能写了个假算法 假设定义:含有一个欧拉路的图为类欧拉图 欧拉路的定义:一个无向连通图中,存在一条路径对所有边都遍历且仅遍历一次:判断方法:该连通图中度为奇数的点的个数不能超过2,即为0或者2 题目解 ...

  3. Codeforces Round #508 (Div. 2) E. Maximum Matching(欧拉路径)

     E. Maximum Matching 题目链接:https://codeforces.com/contest/1038/problem/E 题意: 给出n个项链,每条项链左边和右边都有一种颜色(范 ...

  4. Codeforces 1038 E - Maximum Matching

    E - Maximum Matching 思路: 欧拉图 定理:一个度数为奇数的点的个数小于等于2的联通图存在欧拉回路 对于这道题目的图,点的个数为4,所以最坏的情况下4个点的度数都为奇数,在这种情况 ...

  5. Codeforces 484B Maximum Value(高效+二分)

    题目链接:Codeforces 484B Maximum Value 题目大意:给定一个序列,找到连个数ai和aj,ai%aj尽量大,而且ai≥aj 解题思路:类似于素数筛选法的方式,每次枚举aj,然 ...

  6. Codeforces C. Maximum Value(枚举二分)

    题目描述: Maximum Value time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. codeforces B.Maximum Absurdity 解题报告

    题目链接:http://codeforces.com/contest/332/problem/B 题意:在一个序列中,在所有长度为k的区间里找出两个不重叠的最大和,输出这两个最大和所对应的开头的位置a ...

  8. Codeforces 484B Maximum Value(排序+二分)

    题目链接: http://codeforces.com/problemset/problem/484/B 题意: 求a[i]%a[j] (a[i]>a[j])的余数的最大值 分析: 要求余数的最 ...

  9. Codeforces 888E Maximum Subsequence

    原题传送门 E. Maximum Subsequence time limit per test 1 second memory limit per test 256 megabytes input ...

随机推荐

  1. (appium+python)UI自动化_08_unittest编写测试用例

    前言 unittest是python自带的单元测试框架,类似于Junit(Java单元测试框架).支持自动化测试,可编写测试前置&后置条件,并且可批量运行测试用例并生成测试报告. 使用unit ...

  2. 【ABAP系列】SAP ABAP 总结常用术语简称解析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 总结常用术语简 ...

  3. 京东商品评论的分类预测与LSA、LDA建模

    (一)数据准备 1.爬取京东自营店kindle阅读器的评价数据,对数据进行预处理,使用机器学习算法对评价文本进行舆情分析,预测某用户对本商品的评价是好评还是差评.通过数据分析与模型分析,推测出不同型号 ...

  4. linux下的sleep()和usleep()的使用和区别

    函数名: sleep头文件: #include<windows.h> // 在VC中使用带上头文件              #include<unistd.h>    // ...

  5. VS2012生成Web时报未能找到元数据文件xxx.dll

    问题:引用里已经添加了,还是报‘未能找到元数据文件xxx.dll’ 解决:添加了相同的不同路径的xxx.dll文件,删掉一个用不到的,就不报错了

  6. 4、、多变量线性回归(Linear Regression with Multiple Variables)

    4.1 多维特征 目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,...xn) 增添更多特征后, ...

  7. BFS+打印路径

    题目是给你起点sx,和终点gx:牛在起点可以进行下面两个操作: 步行:John花一分钟由任意点X移动到点X-1或点X+1. 瞬移:John花一分钟由任意点X移动到点2*X. 你要输出最短步数及打印路径 ...

  8. sqlserver创建索引语句

    CREATE INDEX PersonIndex ON 表名 (字段名)   DROP INDEX PersonIndex ON 表名

  9. k8s入门教程

    1. k8s概述 Kubernetes(简称K8S) 是Google开源的分布式的容器管理平台,方便我们在服务器集群中管理我们容器化应用. 教程主要介绍怎么使用阿里云容器服务(kubernetes版本 ...

  10. k3 cloud查看附件提示授予目录NetWorkService读写权限

    打开文件的时候出现下面的提示: 解决办法: 解决办法:找到C:\Program Files(x86)\Kingdee\K3Cloud\WebSite\FileUpLoadServices,在下面创建F ...