[hdu7074]Little prince and the garden of roses
显然每种颜色的花是独立的,可以分别求出答案后取$\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 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 305
4 #define fi first
5 #define se second
6 vector<pair<int,int> >v[N*N];
7 int t,n,x,y,mx,tot,c[N][N],d[N<<1],vis[N<<1][N],ans[N][N];
8 int main(){
9 scanf("%d",&t);
10 while (t--){
11 scanf("%d",&n);
12 mx=tot=0;
13 for(int i=1;i<=n*n;i++)v[i].clear();
14 for(int i=1;i<=n;i++)
15 for(int j=1;j<=n;j++){
16 scanf("%d",&x);
17 ans[i][j]=-1;
18 v[x].push_back(make_pair(i,j));
19 }
20 for(int i=1;i<=n*n;i++){
21 for(int j=0;j<=(n<<1);j++)d[j]=0;
22 for(int j=0;j<v[i].size();j++)d[v[i][j].fi]++,d[v[i][j].se+n]++;
23 for(int j=1;j<=(n<<1);j++)d[0]=max(d[0],d[j]);
24 mx=max(mx,--d[0]);
25 for(int j=1;j<=(n<<1);j++)
26 for(int k=0;k<=d[0];k++)vis[j][k]=0;
27 for(int j=0;j<v[i].size();j++){
28 x=v[i][j].fi,y=v[i][j].se+n;
29 int c1,c2;
30 for(int k=0;k<=d[0];k++)
31 if (!vis[x][k])c1=k;
32 for(int k=0;k<=d[0];k++)
33 if (!vis[y][k])c2=k;
34 while (y){
35 if (ans[x][y-n]>=0)vis[y][ans[x][y-n]]=0;
36 ans[x][y-n]=c1,vis[x][c1]=y;
37 swap(vis[y][c1],x);
38 if (!x)break;
39 if (ans[x][y-n]>=0)vis[x][ans[x][y-n]]=0;
40 ans[x][y-n]=c2,vis[y][c2]=x;
41 swap(vis[x][c2],y);
42 }
43 }
44 }
45 for(int i=1;i<=n;i++)
46 for(int j=1;j<=n;j++)
47 if (ans[i][j])tot++;
48 printf("%d %d\n",mx,tot);
49 for(int i=1;i<=n;i++)
50 for(int j=1;j<=n;j++)
51 if (ans[i][j])printf("%d %d %d\n",i,j,ans[i][j]);
52 }
53 return 0;
54 }
[hdu7074]Little prince and the garden of roses的更多相关文章
- 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 ...
- Little Prince
You know — one loves the sunset, when one is so sad... 你知道的—当一个人情绪低落的时候,他会格外喜欢看日落...... If someone l ...
- HDU5977 Garden of Eden(树的点分治)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5977 Description When God made the first man, he ...
- hdu-5977 Garden of Eden(树分治)
题目链接: Garden of Eden Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- nginx+iis、NLB、Web Farm、Web Garden、ARR
nginx+iis实现负载均衡 在win2008R2上使用(NLB)网络负载均衡 NLB网路负载均衡管理器详解 [译文]Web Farm和Web Garden的区别? IIS负载均衡-Applicat ...
- uva10001 Garden of Eden
Cellular automata are mathematical idealizations of physical systems in which both space and time ar ...
- 超强语感训练文章(Provided by Rocky teacher Prince)
Content: Class1 My name is Prince Class2 Welcome to our hotel Class3 We’re not afraid of problems Cl ...
- CF459A Pashmak and Garden (水
Pashmak and Garden Codeforces Round #261 (Div. 2) A. Pashmak and Garden time limit per test 1 second ...
- 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 ...
随机推荐
- CefSharp请求资源拦截及自定义处理
CefSharp请求资源拦截及自定义处理 前言 在CefSharp中,我们不仅可以使用Chromium浏览器内核,还可以通过Cef暴露出来的各种Handler来实现我们自己的资源请求处理. 什么是资源 ...
- 微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版
微软今天发布了Visual Studio 2022 最接近正式发布的RC版本,同时宣布在11月8日发布正式版,届时将在线上发布虚拟的发布活动,具体参见:https://devblogs.microso ...
- 【分享】 一款自用的Anki卡片模板:黄子涵单词卡片 v1
[分享] 一款自用的Anki卡片模板:黄子涵单词卡片 v1 说明 第一代的功能 主要有两部分组成:英文和含义,目前主要是为自己记忆Web前端一些常用的单词而服务 有美美哒背景图,本来想修改为随机背景图 ...
- 2020.10.30--vj个人赛补题
D - D CodeForces - 743A Vladik is a competitive programmer. This year he is going to win the Interna ...
- UE4蓝图AI角色制作(六)之行为树
13.行为树原理 AI最重要的环节就是行为树.我们将解释什么是行为树.为何它如此重要,以及构建行为树需要哪些元素. 借助行为树,我们可以轻松控制并显示AI的决策制定过程.行为树是一种将AI在场景中的决 ...
- 【数据结构与算法Python版学习笔记】图——强连通分支
互联网 我们关注一下互联网相关的非常巨大图: 由主机通过网线(或无线)连接而形成的图: 以及由网页通过超链接连接而形成的图. 网页形成的图 以网页(URI作为id)为顶点,网页内包含的超链接作为边,可 ...
- 面试题系列:new String("abc")创建了几个对象
new String("abc")创建了几个对象 面试官考察点猜想 这种问题,考察你对JVM的理解程度.涉及到常量池.对象内存分配等问题. 涉及背景知识详解 在分析这个问题之前,我 ...
- 关于QGIS的插件开发(C++)
关于C++插件的开发材料较少,根据网上的指导,我采用了早期版本的插件模板生成的方法来创建QGIS的插件,其方法是从以前版本(2.18.25)里面拷贝插件模板的方法进行,具体的执行步骤为 1.拷贝文件 ...
- 请问为什么要用三极管驱动mos,直接用mos有什么缺点呢?
可能无法完全导通,电流可能过小使导通所需时间变长,最终导致发热严重 回复 举报 csaaa DIY七级 3# 发表于 2016-7-12 14:11:59 直接驱动mos也没什么问 ...
- 攻防世界 杂项 11.simple_transfer
题目描述: 文件里有flag,找到它. 题目分析: 文件解压后是一个抓包流量分析文件,用 wireshark 打开后,用分组字节流搜索 flag,追踪 TCP 流,可以隐约看到有 file.pdf, ...