这题给的一个教训:Codeforces没有超时这个概念。本来以为1000*(1000+1)/2*10*10要超时的。结果我想多了。

这题由于k层都可能有关系,所以建一个图,每两个点之间连边,边权为n*m和他们之间的差值*w的最小值,然后求一个最小生成树就可以得出结果。且可以证明不会存在环。由于边比较稠密,用Prim算法求最小生成树。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define Mod 1000000007
using namespace std;
#define N 2007 char mp[][][];
int G[][],from[];
int n,m,res,id,k,w;
int vis[],len[]; struct Ans
{
int ind,pre;
}ans[]; int min(int ka,int kb)
{
if(ka < kb)
return ka;
return kb;
} int dif(char a[][],char b[][])
{
int cnt = ;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
if(a[i][j] != b[i][j])
cnt++;
}
}
return cnt;
} void Prim()
{
int i,j,tag,mini;
res = ;
id = ;
memset(vis,,sizeof(vis));
memset(from,,sizeof(from));
for(i=;i<=k;i++)
len[i] = n*m; //最大为n*m
for(i=;i<=k;i++)
{
mini = Mod;
for(j=;j<=k;j++)
{
if(!vis[j] && len[j] < mini)
{
mini = len[j];
tag = j;
}
}
if(mini == Mod)
return;
res += len[tag];
if(len[tag] == n*m)
ans[id].ind = tag,ans[id++].pre = ;
else
ans[id].ind = tag,ans[id++].pre = from[tag];
vis[tag] = ;
for(j=;j<=k;j++)
{
if(!vis[j] && len[j] > G[tag][j])
{
len[j] = G[tag][j];
from[j] = tag;
}
}
}
} int main()
{
int i,j;
while(scanf("%d%d%d%d",&n,&m,&k,&w)!=EOF)
{
id = ;
for(i=;i<=k;i++)
{
for(j=;j<n;j++)
scanf("%s",mp[i][j]);
}
int T = n*m;
for(i=;i<=k;i++)
{
for(j=i+;j<=k;j++)
G[j][i] = G[i][j] = min(dif(mp[i],mp[j])*w,T);
G[i][i] = ;
}
Prim();
printf("%d\n",res);
for(i=;i<id;i++)
printf("%d %d\n",ans[i].ind,ans[i].pre);
}
return ;
}

最新文章

  1. Picture effect of JavaScript
  2. hibernate检索方式(HQL 检索方式,QBC 检索方式,本地 SQL 检索方式)
  3. UESTC 886 方老师金币堆 --合并石子DP
  4. Android 自定义控件-TextView
  5. 九章算法系列(#2 Binary Search)-课堂笔记
  6. SharePoint2010 部署步骤“激活功能”中出现错误:无法启动计算机“PCName”上的服务SPUserCodeV4
  7. windows server 定期备份数据库脚本
  8. 201521123007《Java程序设计》第14周学习总结
  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(87)-MVC Excel导入和导出
  10. JS中有关正则表达式的一些常见应用
  11. Git 进阶 —— 远程仓库
  12. [Swift]LeetCode756. 金字塔转换矩阵 | Pyramid Transition Matrix
  13. springboot整合mybatis的多数据源解决办法
  14. 关于h5绘制canvas生成图片的注意点!
  15. Spine用于Timeline(NullReferenceException: Object reference not set to an instance of an object pine.Unity.Editor.AnimationReferenceAssetEditor.OnInspectorGUI ())
  16. c++中的两种getline用法
  17. 小tips:JS之浅拷贝与深拷贝
  18. SSM框架整合过程总结
  19. 20145314郑凯杰《网络对抗技术》PE文件病毒捆绑(插入捆绑)的实现
  20. Linux 系统其他重要文件

热门文章

  1. SystemClock.sleep和Thread.sleep的区别(转)
  2. python基础之常用模块以及格式化输出
  3. windows上JSP开发环境全搭建
  4. C编程常见问题总结
  5. 认识Runtime2
  6. iOS 利用长按手势移动 Table View Cells
  7. 通过StoryBoard加载视图控制器问题
  8. Silverlight项目笔记4:初识Prism以及IoC
  9. 深入理解java虚拟机(7)---线程安全 &amp; 锁优化
  10. SQLServer中char与varchar的区别