显然每种颜色的花是独立的,可以分别求出答案后取$\max$

对于某种颜色$C$,建立一张二分图,左右分别为$n$行$n$列,且第$i$行和第$j$列有边当且仅当$c_{i,j}=C$

此时,问题即对边染色,并要求相同颜色的边没有公共端点,并最少化颜色数(包含初始颜色)

这是二分图的边着色问题,其答案即二分图中所有点度数的最大值(记为$\Delta$)

显然这些颜色是必要的(即不能更少),下面构造来说明这是足够的——

做法1:

依次对边染色(顺序任意),若当前边存在某种剩余的颜色即使用,否则总存在一种颜色$c_{1}$和$c_{2}$,满足两者分别不在以$x$和$y$为端点的边中出现

(如果不存在,不难得到$x$或$y$的度数大于颜色数)

另一方面,由于$c_{1}$和$c_{2}$都不能使用,那么$c_{1}$和$c_{2}$必然分别在以$y$和$x$为端点的边中出现

不妨假设$c_{1}$在边$(y,z_{0})$上使用,并分类讨论:

1.$c_{2}$不在以$z_{0}$为端点的边中出现,那么将$(x,y)$和$(y,z_{0})$分别染成$c_{1}$和$c_{2}$即可

2.$c_{2}$在以$z_{0}$为端点的边中出现,假设为$(z_{0},z_{1})$,考虑重新染$(z_{0},z_{1})$,再分类讨论:

(1)若$c_{1}$在不以$z_{1}$为端点的边中出现,那么将$(x,y),(y,z_{0})$和$(z_{0},z_{1})$分别染成$c_{1},c_{2}$和$c_{1}$即可

(2)若$c_{1}$在以$z_{1}$为端点的边中出现,假设为$(z_{1},z_{2})$,重新染$(z_{1},z_{2})$,再分类讨论……

(具体的以此类推,即重复此过程直至出现第1种情况)

由于是二分图,不难发现一个点不会被重复访问(否则即说明其存在两条$c_{1}$或$c_{2}$的边),因此总能够找到方案,并记边集大小为$|E|$(也即$c_{i,j}=C$的位置数),时间复杂度为$o(n|E|)$

总复杂度为$o(n^{3})$,可以通过

做法2:

考虑将每一个点的度数补至$\Delta$,进而求出$\Delta$组完美匹配(每一组完美匹配的边对应一种颜色),然后删除补充的边即得到原图的一组方案

第一步只需要不断在两边中各选一个度小于$\Delta$的点连边即可(允许重边),第二步使用网络流来做二分图匹配(并得到方案),时间复杂度为$o(\Delta n^{1.5})$(点集和边集分别大小为$n$和$n\Delta$)

关于第二步中存在$\Delta$组完美匹配,可以考虑归纳证明,注意到一组完美匹配删去后即将所有点度数都减去1,而当$\Delta=1$时将所有边都选上即构成完美匹配(那么$\Delta>1$时显然也存在完美匹配)

总复杂度为$o(n^{3.5})$,可能有一些卡

(代码是做法1的)

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 #define N 305
  4. 4 #define fi first
  5. 5 #define se second
  6. 6 vector<pair<int,int> >v[N*N];
  7. 7 int t,n,x,y,mx,tot,c[N][N],d[N<<1],vis[N<<1][N],ans[N][N];
  8. 8 int main(){
  9. 9 scanf("%d",&t);
  10. 10 while (t--){
  11. 11 scanf("%d",&n);
  12. 12 mx=tot=0;
  13. 13 for(int i=1;i<=n*n;i++)v[i].clear();
  14. 14 for(int i=1;i<=n;i++)
  15. 15 for(int j=1;j<=n;j++){
  16. 16 scanf("%d",&x);
  17. 17 ans[i][j]=-1;
  18. 18 v[x].push_back(make_pair(i,j));
  19. 19 }
  20. 20 for(int i=1;i<=n*n;i++){
  21. 21 for(int j=0;j<=(n<<1);j++)d[j]=0;
  22. 22 for(int j=0;j<v[i].size();j++)d[v[i][j].fi]++,d[v[i][j].se+n]++;
  23. 23 for(int j=1;j<=(n<<1);j++)d[0]=max(d[0],d[j]);
  24. 24 mx=max(mx,--d[0]);
  25. 25 for(int j=1;j<=(n<<1);j++)
  26. 26 for(int k=0;k<=d[0];k++)vis[j][k]=0;
  27. 27 for(int j=0;j<v[i].size();j++){
  28. 28 x=v[i][j].fi,y=v[i][j].se+n;
  29. 29 int c1,c2;
  30. 30 for(int k=0;k<=d[0];k++)
  31. 31 if (!vis[x][k])c1=k;
  32. 32 for(int k=0;k<=d[0];k++)
  33. 33 if (!vis[y][k])c2=k;
  34. 34 while (y){
  35. 35 if (ans[x][y-n]>=0)vis[y][ans[x][y-n]]=0;
  36. 36 ans[x][y-n]=c1,vis[x][c1]=y;
  37. 37 swap(vis[y][c1],x);
  38. 38 if (!x)break;
  39. 39 if (ans[x][y-n]>=0)vis[x][ans[x][y-n]]=0;
  40. 40 ans[x][y-n]=c2,vis[y][c2]=x;
  41. 41 swap(vis[x][c2],y);
  42. 42 }
  43. 43 }
  44. 44 }
  45. 45 for(int i=1;i<=n;i++)
  46. 46 for(int j=1;j<=n;j++)
  47. 47 if (ans[i][j])tot++;
  48. 48 printf("%d %d\n",mx,tot);
  49. 49 for(int i=1;i<=n;i++)
  50. 50 for(int j=1;j<=n;j++)
  51. 51 if (ans[i][j])printf("%d %d %d\n",i,j,ans[i][j]);
  52. 52 }
  53. 53 return 0;
  54. 54 }

[hdu7074]Little prince and the garden of roses的更多相关文章

  1. UVA 10798 - Be wary of Roses (bfs+hash)

    10798 - Be wary of Roses You've always been proud of your prize rose garden. However, some jealous f ...

  2. Little Prince

    You know — one loves the sunset, when one is so sad... 你知道的—当一个人情绪低落的时候,他会格外喜欢看日落...... If someone l ...

  3. HDU5977 Garden of Eden(树的点分治)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5977 Description When God made the first man, he ...

  4. hdu-5977 Garden of Eden(树分治)

    题目链接: Garden of Eden Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  5. nginx+iis、NLB、Web Farm、Web Garden、ARR

    nginx+iis实现负载均衡 在win2008R2上使用(NLB)网络负载均衡 NLB网路负载均衡管理器详解 [译文]Web Farm和Web Garden的区别? IIS负载均衡-Applicat ...

  6. uva10001 Garden of Eden

    Cellular automata are mathematical idealizations of physical systems in which both space and time ar ...

  7. 超强语感训练文章(Provided by Rocky teacher Prince)

    Content: Class1 My name is Prince Class2 Welcome to our hotel Class3 We’re not afraid of problems Cl ...

  8. CF459A Pashmak and Garden (水

    Pashmak and Garden Codeforces Round #261 (Div. 2) A. Pashmak and Garden time limit per test 1 second ...

  9. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 G. Garden Gathering

    Problem G. Garden Gathering Input file: standard input Output file: standard output Time limit: 3 se ...

随机推荐

  1. 十一、Abp vNext 基础篇丨测试

    前言 祝大家国庆快乐,本来想国庆之前更新完的,结果没写完,今天把剩下的代码补了一下总算ok了. 本章节也是我们后端日常开发中最重要的一步就是测试,我们经常听到的单元测试.集成测试.UI测试.系统测试, ...

  2. 从零入门 Serverless | SAE 的远程调试和云端联调

    作者 | 弈川 阿里巴巴云原生团队 导读:本节课程包含三部分内容,前两个部分简单介绍远程调试以及端云联调的原理,最后在 Serverless 应用引擎中进行实际演示. 经过之前课程的学习,相信大家对于 ...

  3. 苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功

    苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功 这是苹果wwdc2021 推出的新功能 参考官网链接 App Store Server API | Apple Deve ...

  4. Flink sql 之 TopN 与 StreamPhysicalRankRule (源码解析)

    基于flink1.14的源码做解析 公司内有很多业务方都在使用我们Flink sql平台做TopN的计算,今天同事突然问到我,Flink sql 是怎么实现topN的 ? 蒙圈了,这块源码没看过啊 , ...

  5. Golang通脉之基础入门

    为什么要学 Go 性能优越感:Go 极其地快,其性能与 Java 或 C++相似.在使用中,Go 一般比 Python 要快 30 倍: 序列化/去序列化.排序和聚合中表现优异: 开发者效率较高:多种 ...

  6. 【Spring】IoC容器 - 依赖查找

    前言 上一篇文章已经学习了[IoC的主要实现策略]有2种: 1.依赖查找 2.依赖注入 这里稍加详细的介绍一下依赖查找 1.依赖查找的方式 依赖查找的方式可以以多种维度来划分: 1.按名称/类型/注解 ...

  7. Map中getOrDefault()与数值进行比较

    一般用哈希表计数时,value类型通常为Integer.如果想比较某个key出现的次数,使用get(key)与某个数值进行比较是有问题的.当哈希表中并不包含该key时,因为此时get方法返回值是nul ...

  8. AIApe问答机器人Scrum Meeting 4.23

    Scrum Meeting 1 日期:2021年4月23日 会议主要内容概述:各成员汇报进度情况,前后端针对WebAPI进行协调与统一工作. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完 ...

  9. [对对子队]会议记录4.16(Scrum Meeting7)

    今天已完成的工作 何瑞 ​ 工作内容:完成成本和分数系统 ​ 相关issue:实现成本和分数系统的逻辑 ​ 相关签入:4.16签入1 吴昭邦 ​ 工作内容:对接流水线和成本和分数系统 ​ 相关issu ...

  10. Spring 5 中函数式web开发中的swagger文档

    Spring 5 中一个非常重要的更新就是增加了响应式web开发WebFlux,并且推荐使用函数式风格(RouterFunction和 HandlerFunction)来开发WebFlux.对于之前主 ...