题目: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. JS截取与分割字符串

    1.substr 方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) start :必选项.所需的子字符串的起始位置.字符串中的 ...

  2. HTML5-autio、video视频音频

    完整版视屏web播放器: 基本autio和ideo介绍 <!DOCTYPE html> <html lang="en"> <head> < ...

  3. eclipse以及myeclipse的xml配置文件没有提示的问题解决

    对于在使用hibernate时,需要对配置文件进行配置,我们需要引入dtd约束文件.在有网的情况下,可以直接从网上下载,编写xml配置文件的时候,可以提示:在没网的情况下,那么就提示不出来. 下面的方 ...

  4. luoguP3391[模板]文艺平衡树(Splay) 题解

    链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...

  5. 问题 1436: 地宫取宝 (dp)

    题目传送门 时间限制: 1Sec 内存限制: 128MB 提交: 423 解决: 94 题目描述 X  国王有一个地宫宝库.是  n  x  m  个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标 ...

  6. mt-picker 样式修改

    // html : <div class="applyInformations" @click="chooseSex"> <p>性别&l ...

  7. centos7配置sudo免密

    1.chmod  +w   /etc/sudoers 2.vim  /etc/sudoers 在已经有了的root下面加 username  ALL=NOPASSWD:ALL      (这是所有的命 ...

  8. Beta阶段成果展示——第八组

    Beta阶段成果展示 游戏公网IP:http://119.29.32.204/krad.html(欢迎大家测试!) Beta阶段体现在成果上的工作主要为界面美化,玩家引导,按键封闭等等. 本文将以截图 ...

  9. vue,一路走来(3)--数据交互vue-resource

    所有的静态页面布局完成后,最重要的就是数据交互了,简单来说,vue-resource就像jquery里的$.ajax,用来和后台交互数据的.放在created或ready里运行来获取或者更新数据的.不 ...

  10. 脚本_根据 md5 校验码,检测文件是否被修改

    #!bin/bash#功能:根据 md5 校验码,检测文件是否被修改#作者:liusingbon#本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,您可以修改为其他目录或文 ...