设一个开头的虚节点,然后建稠密图,O(n^2)。使用prim。O(n^2),保存方案,没什么好说的。

#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
int k,w,n,m;
int cnt;
int map[1005][1005];
char data[1002][11][11];
int father[1005];
struct node
{
int pre,to;
}save[1005];
int prim()
{
int ans=0;
int i,j;
int vis[1005];
int dis[1005];
memset(vis,0,sizeof(vis));
memset(dis,0x7f,sizeof(dis));
int inf=dis[0];
vis[0]=1;
int min;
for (i=1;i<=k;i++)
{
dis[i]=map[0][i];
father[i]=0;
}
int u;
for (i=0;i<k;i++)
{
min=inf;
for (j=0;j<=k;j++)
if (!vis[j] && min>dis[j])
{ u=j;
min=dis[j];
}
vis[u]=1;
ans+=dis[u];
save[cnt].pre=u;save[cnt].to=father[u];
cnt++;
for (int p=0;p<=k;p++)
if (u!=p && !vis[p])
if (dis[p]>map[u][p])
{
dis[p]=map[u][p];
father[p]=u;
}
}
return ans;
} int main()
{
int i;
while (scanf("%d%d%d%d",&n,&m,&k,&w)!=EOF)
{
cnt=0;
for (i=1;i<=k;i++)
{
for (int j=0;j<n;j++)
scanf("%s",data[i][j]);
}
for (i=1;i<=k;i++)
{
map[0][i]=n*m;
map[i][0]=m*n;
}
int tmp;
for (i=1;i<=k;i++)
{
for (int j=i+1;j<=k;j++)
{
tmp=0;
for (int p=0;p<n;p++)
for (int q=0;q<m;q++)
if (data[i][p][q]!=data[j][p][q])
tmp+=w;
map[i][j]=tmp;
map[j][i]=tmp;
}
}
printf("%d\n",prim());
for (i=0;i<cnt;i++)
printf("%d %d\n",save[i].pre,save[i].to);
}
return 0;
}

  

CF 436D 最小生成树的更多相关文章

  1. CF Educational Codeforces Round 3 E. Minimum spanning tree for each edge 最小生成树变种

    题目链接:http://codeforces.com/problemset/problem/609/E 大致就是有一棵树,对于每一条边,询问包含这条边,最小的一个生成树的权值. 做法就是先求一次最小生 ...

  2. CF 160D Edges in MST 最小生成树的性质,寻桥,缩点,批量处理 难度:3

    http://codeforces.com/problemset/problem/160/D 这道题要求哪条边存在于某个最小生成树中,哪条边不存在于最小生成树中,哪条边绝对存在于最小生成树中 明显桥边 ...

  3. CF F. MST Unification (最小生成树避圈法)

    题意 给一个无向加权联通图,没有重边和环.在这个图中可能存在多个最小生成树(MST),你可以进行以下操作:选择某条边使其权值加一,使得MST权值不变且唯一.求最少的操作次数. 分系:首先我们先要知道为 ...

  4. CF Grakn Forces 2020 1408E Avoid Rainbow Cycles(最小生成树)

    1408E Avoid Rainbow Cycles 概述 非常有趣的题目(指解法,不难,但很难想) 非常崇拜300iq,今天想做一套div1时看见了他出的这套题Grakn Forces 2020,就 ...

  5. cf Inverse the Problem (最小生成树+DFS)

    题意: N个点.N行N列d[i][j]. d[i][j]:结点i到结点j的距离. 问这N个点是否可能是一棵树.是输出YES,否则输出NO. 思路: 假设这个完全图是由一棵树得来的,则我们对这个完全图求 ...

  6. Hdu 4081 最小生成树

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

  7. [Usaco2007 Dec]Building Roads 修建道路[最小生成树]

    Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农 ...

  8. UOJ236 IOI2016 Railroad 差分、欧拉回路、最小生成树

    传送门 将"进入路段时速度\(\leq s_i\)"转换为:"进入路段时速度恰好等于\(s_i\),并且铺设铁轨有加速和减速两种,加速无需代价,减速每\(1 km/h\) ...

  9. 算法实践--最小生成树(Kruskal算法)

    什么是最小生成树(Minimum Spanning Tree) 每两个端点之间的边都有一个权重值,最小生成树是这些边的一个子集.这些边可以将所有端点连到一起,且总的权重最小 下图所示的例子,最小生成树 ...

随机推荐

  1. for 循环新的写法==列表解析

    1. (for x in L1) 是一个可迭代对象: 2. 列表解析比for 循环快,列表解析的迭代在解释器内部是以C语言速度执行, 而不是手动python代码执行: (x+10 for x in L ...

  2. PAT 1141 PAT Ranking of Institutions

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  3. Spring整合Junit框架

    一.开发环境 eclipse版本:4.6.1 maven版本:3.3.3 junit版本:4.12 spring版本:4.1.5.RELEASE JDK版本:1.8.0_111 二.项目结构 图 三. ...

  4. 【整理】uclibc,eglibc,glibc之间的区别和联系

    http://www.crifan.com/relation_between_uclibc_glibc_eglibc/ 1.Glibc glibc = GNU C Library 是GNU项(GNU ...

  5. 夜话JAVA设计模式之代理模式(Proxy)

    代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...

  6. 洛谷—— P2149 [SDOI2009]Elaxia的路线

    https://www.luogu.org/problem/show?pid=2149 题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两 ...

  7. Codeforces 300E(数学)

    题意:给定k个数字,求最小的正整数n,使得“n的阶乘”是“这k个数字的阶乘的积”的倍数.1<=k<=1e6,数字ai满足1<=ai<=1e7 分析:如果我们能对着k个数字的阶乘 ...

  8. Spring Boot配置文件规则以及使用方法官方文档查找以及Spring项目的官方文档查找方法

    比如要使用Spring Boot实现一个功能,最直接的方式是Google,但是往往搜索出来的都比较乱,关键是乱在不同的版本上,比如1.x版本和2.x版本的配置是不一样的.最明显区别是在使用Thymel ...

  9. ms sql SERVER 下载

    企业版DVD SQL Server 2005 Enterprise Edition(支持超大型企业) 32 位DVD: ed2k://|file|cs_sql_2005_ent_x86_dvd.iso ...

  10. ubuntu tweak Install

    ubuntu tweak 1:增加PPA源 sudo add-apt-repository ppa:tualatrix/ppa 2:編輯源列表sudo gedit /etc/apt/sources.l ...