题目: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[7][7][121],f[7][7],vis[7];
int ans=0;
void dfs(int x,int tmp){for(int y=1;y<=4;++y)if(!vis[x] && !vis[y])tmp+=f[x][y];++vis[x];if(tmp>ans)ans=tmp;for(int y=1;y<=4;++y)if(x!=y && e[x][y][0]>0){tmp+=e[x][y][e[x][y][0]];--e[x][y][0];--e[y][x][0];dfs(y,tmp);++e[x][y][0];++e[y][x][0];tmp-=e[x][y][e[x][y][0]];}--vis[x];for(int y=1;y<=4;++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=0,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][0]]=val;}for(int i=1;i<=4;++i){for(;e[i][i][0];--e[i][i][0])f[i][i]+=e[i][i][e[i][i][0]];for(int j=i+1;j<=4;++j){std::sort(e[i][j]+1,e[i][j]+e[i][j][0]+1);for(;e[i][j][0]>2;e[i][j][0]-=2)f[i][j]+=e[i][j][e[i][j][0]]+e[i][j][e[i][j][0]-1];e[j][i][0]=e[i][j][0];e[j][i][1]=e[i][j][1];e[j][i][2]=e[i][j][2];f[j][i]=f[i][j];}}dfs(4,0);for(int i=1;i<=4;++i)dfs(i,0);printf("%d",ans);return 0;
}

方法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

转载于:https://www.cnblogs.com/hjj1871984569/p/9646147.html

[codeforces 508E]Maximum Matching相关推荐

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

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

  2. 【CodeForces 332B --- Maximum Absurdity】递推

    [CodeForces 332B --- Maximum Absurdity]递推 题目来源:点击进入[CodeForces 332B - Maximum Absurdity] Description ...

  3. [CodeForces 332B]Maximum Absurdity[DP]

    题目链接: [CodeForces 332B]Maximum Absurdity[DP] 题意分析: 寻找两个不重叠的长度为k的子串,使得它们之和最大. 解题思路: 第一想法是,处理出从这个点开始,长 ...

  4. CodeForces - 1476E Pattern Matching(字典树+拓扑)

    题目链接:点击查看 题目大意:给出 nnn 个模式串和 mmm 个匹配串,题目要求输出一种模式串的排列方式,使得 mmm 个模式串从头开始匹配的话,可以匹配到相应的模式串 模式串的长度不超过 444, ...

  5. Codeforces 889C Maximum Element(DP + 计数)

    题目链接  Maximum Element 题意  现在有这一段求序列中最大值的程度片段: (假定序列是一个1-n的排列) int fast_max(int n, int a[]) { int ans ...

  6. CodeForces 332B Maximum Absurdity

    http://codeforces.com/problemset/problem/332/B 给出n个数,再个一个长度,问在n个数的数列中,找到2个相应长度的数串求和最大,且这两个数串不能重叠.只要对 ...

  7. Codeforces 332B Maximum Absurdity(DP+前缀和处理)

    题目链接:http://codeforces.com/problemset/problem/332/B 题目大意: 给你n个数和一个整数k,要求找到不相交的两个长度为k的区间,使得区间和最大,输出这两 ...

  8. codeforces B.Maximum Absurdity 解题报告

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

  9. CodeForces 508E Arthur and Brackets 贪心

    题目: E. Arthur and Brackets time limit per test 2 seconds memory limit per test 128 megabytes input s ...

最新文章

  1. iOS 9 适配系列教程
  2. 基本算法学习(一)之希尔排序(JS)
  3. SysAid 9.0 发布,增加移动设备管理功能
  4. centos7 python3 sqlserver_Centos7.3下SQLServer安装配置方法图文教程
  5. 如何将ipynb转换为html,md,pdf等格式
  6. python运行py文件参数错误_Pycharm运行加载文本出现错误的解决方法
  7. 希尔排序基础java代码_java 算法之希尔排序详解及实现代码
  8. ReactiveCocoa简单介绍
  9. 作者:陆扬(1985-),女,中国科学院上海天文台助理工程师
  10. oracle+dblink不管用,oracle dblink问题
  11. 【FFMPEG系列】之windows下编译FFMPEG篇----之二(MSYS2)
  12. windows命令总结
  13. 7. where loop
  14. 三菱FX2N系列PLC的模拟量扩展模块简介
  15. java+网络框架netty_GitHub - linyu19872008/getty-1: 一个完全基于java 实现的,长得有点像netty的aio网络框架...
  16. 启科量子开源量子编程框架 QuTrunk
  17. png图片的文件存储格式
  18. 快收下这枚 Scrapy Requests 口味的爬虫“回魂丹”
  19. android Compose Modifier介绍
  20. Wind万得PythonAPI量化接口常用小工具——时序数据处理及工作日前推查询

热门文章

  1. 自定义时间格式 返回年月日
  2. 知识点二、PHP简单的分页过程与原理
  3. 二十个CSS经典技巧
  4. 关于__VA_ARGS__的说明
  5. 计算机科学班(原acm班),计算机科学创新实验班(以下简称ACM班)培养计划.doc
  6. 单片机利用蜂鸣器如何输出音乐
  7. java同步锁synchronized_Java对象锁和类锁全面解析(多线程synchronized关键字)
  8. 将mysql日期格式转换_如何将日期时间格式转换为mysql日期格式?
  9. Android进程保活招式大全
  10. python定义私有变量的方法_Python面向对象程序设计之私有变量,私有方法原理与用法分析...