题目链接

  • 题意:

    k个点,每一个点都是一个n * m的char型矩阵。对与每一个点,权值为n * m或者找到一个之前的点,取两个矩阵相应位置不同的字符个数乘以w。找到一个序列,使得全部点的权值和最小
  • 分析:

    首先,这个图是一个无向图。求权值和最小,每一个权值相应的是一条边,且每一个点仅仅能有一个权值即一条边,一个k个边,和生成树非常像,可是须要证明不能有环形。最好还是如果如今有三个点,每一个点的最小边成环,这时候是不能找到一个序列使得每一个点都取到它的最小边值的,所以,k个点k个边不能有环且边值和最小,就是最小生成树。

prim算法:
const int maxn = 1100;

char ipt[maxn][11][11];
int dist[maxn][maxn];
int d[maxn], p[maxn];
bool vis[maxn];
int n, m, k, w; int main()
{
// freopen("in.txt", "r", stdin);
while (~RIV(n, m, k, w))
{
CLR(dist, 0);
REP(i, k)
{
vis[i] = false;
d[i] = n * m;
p[i] = -1;
} REP(i, k) REP(j, n)
RS(ipt[i][j]);
REP(i, k) REP(j, k) REP(ii, n) REP(jj, m)
dist[i][j] += (ipt[i][ii][jj] != ipt[j][ii][jj]) * w;
d[0] = 0;
int sum = n * m;
VI ans;
REP(i, k)
{
int M = INF, ind;
REP(j, k)
if (!vis[j] && d[j] < M)
{
ind = j;
M = d[j];
}
vis[ind] = true;
sum += M;
ans.push_back(ind);
REP(j, k)
{
if (!vis[j] && dist[ind][j] < d[j])
{
d[j] = dist[ind][j];
p[j] = ind;
}
}
}
WI(sum);
REP(i, ans.size())
{
cout << ans[i] + 1 << ' ' << p[ans[i]] + 1 << endl;
}
}
return 0;
}

kruskal:

const int maxn = 1100;

struct Edge
{
int from, to, dist;
int operator< (const Edge& rhs) const
{
return dist < rhs.dist;
}
Edge (int from = 0, int to = 0, int dist = 0)
{
this->from = from;
this->to = to;
this->dist = dist;
}
}; vector<Edge> G[maxn];
int in[maxn];
vector<Edge> edges;
int fa[maxn];
char ipt[maxn][105];
int diff[maxn][maxn];
int n, m, k, w;
int find(int n)
{
return (n == fa[n]) ? n : (fa[n] = find(fa[n]));
}
void init(int n)
{
REP(i, n)
{
fa[i] = i;
G[i].clear();
in[i] = 0;
}
edges.clear();
}
void AddEdge(int u, int v, int dist)
{
edges.push_back(Edge(u, v, dist));
}
void dfs(int u, int fa)
{
REP(i, G[u].size())
{
Edge& e = G[u][i];
if (e.to != fa)
{
if (e.dist == m * n)
cout << e.to + 1 << ' ' << 0 << endl;
else
cout << e.to + 1 << ' ' << u + 1 << endl;
dfs(e.to, u);
}
}
}
void solve()
{
int ret = 0;
sort(all(edges));
REP(i, edges.size())
{
Edge& e = edges[i];
int ru = find(e.from), rv = find(e.to);
if (ru != rv)
{
fa[ru] = rv;
ret += e.dist;
G[e.from].push_back(Edge(e.from, e.to, e.dist));
G[e.to].push_back(Edge(e.to, e.from, e.dist));
in[e.from]++;
in[e.to]++;
}
}
WI(ret + n * m);
REP(i, k)
{
if (in[i] <= 1)
{
cout << i + 1 << ' ' << 0 << endl;
dfs(i, -1);
break;
}
}
} int judge(int a, int b)
{
int cnt = 0;
REP(i, n * m)
cnt += (ipt[a][i] != ipt[b][i]);
return cnt;
} int main()
{
// freopen("in.txt", "r", stdin);
while (~RIV(n, m, k, w))
{
CLR(diff, 0);
REP(i, k)
{
int len = 0;
REP(j, n)
{
RS(ipt[i] + len);
len = strlen(ipt[i]);
}
}
REP(i, k) REP(j, k) REP(t, n * m)
diff[i][j] += (ipt[i][t] != ipt[j][t]);
init(k);
REP(i, k) REP(j, k)
{
if (i == j)
continue;
AddEdge(i, j, min(diff[i][j] * w, n * m));
}
solve();
}
return 0;
}

Zepto Code Rush 2014——Dungeons and Candies的更多相关文章

  1. Codeforces Zepto Code Rush 2014 -C - Dungeons and Candies

    这题给的一个教训:Codeforces没有超时这个概念.本来以为1000*(1000+1)/2*10*10要超时的.结果我想多了. 这题由于k层都可能有关系,所以建一个图,每两个点之间连边,边权为n* ...

  2. CF Zepto Code Rush 2014 B. Om Nom and Spiders

    Om Nom and Spiders time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  3. Zepto Code Rush 2014 A. Feed with Candy

    此题用贪心求解, 首先将caramel drop类别的糖果按照高度从小到大排序,如果高度相同,按照重量从小到大排序 将fruit drop类别的糖果按照高度从小到大排序,如果高度相同,按照重量从小到大 ...

  4. Zepto Code Rush 2014 B - Om Nom and Spiders

    注意题目给的是一个nxm的park,设元素为aij,元素aij 有4种可能U(上移),D(下移),L(左移),R(右移) 假设第i行第j列元素aij(注意元素的索引是从0开始的) 当aij为D时,此时 ...

  5. Zepto Code Rush 2014-A. Feed with Candy(HACK)

    A. Feed with Candy time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. Dungeons and Candies

    Zepto Code Rush 2014:http://codeforces.com/problemset/problem/436/C 题意:k个点,每个点都是一个n * m的char型矩阵.对与每个 ...

  7. Code Rush插件

    code rush 是微软推出的一款VS2008上的插件.他有强大的文件和代码导航功能,易于访问的重构和代码创建功能.一组编辑器.选择.剪贴板工具等. 教程链接 http://www.devexpre ...

  8. ZeptoLab Code Rush 2015 C. Om Nom and Candies 暴力

    C. Om Nom and Candies Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/526 ...

  9. ZeptoLab Code Rush 2015 C. Om Nom and Candies [ 数学 ]

    传送门 C. Om Nom and Candies time limit per test 1 second memory limit per test 256 megabytes input sta ...

随机推荐

  1. android数据储存之应用安装位置

    原文地址:http://developer.android.com/guide/topics/data/install-location.html#Compatiblity 从API8開始,你能够将你 ...

  2. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 分块

    分块大法好 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 2938  Solved: 13 ...

  3. crm创建基于fetch自己的自定义报告

    在解决方案资源管理器,右键点击"报表"目录.然后点击"增加了新的报告". 打开"报表向导". 在"欢迎来到报表向导"前, ...

  4. 【UML】概念、关联、画画(一)

    最近画UML画画,于UML观看视频后还没有学会.它是的结果UML九图是不是太懂,我想加深绘制过程的理解,我一个新的水平. 现在我觉得是时候..地介绍一下UML.了解一下它的基本内容.达到深入浅出的效果 ...

  5. [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪

    朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...

  6. STL--F - Sequence(n*m-&gt;之前的最低要求m个月)

    F - Sequence Time Limit:6000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  7. java中float/double浮点数的计算失精度问题(转)

    如果我们编译运行下面这个程序会看到什么? public class Test  {    public static void main(String args[]) {                ...

  8. 复制(5)——事务复制中的发布者(Publisher)

    发布者是所有被复制(replicated)的数据的集合.每个发布者可以有多个发布(publication),每个发布项包含多个项目(articles),但是这些发布必须处于一个单一的数据库中,而每个项 ...

  9. R0-R37它是Arm 寄存器,那是,CPU内部。和GPIO注册所有外设。换句话说,要是arm的cpu,它包含了其他芯片公司将有R0-R37,和GPIO寄存器只有一个特定的芯片。

    R0-R37它是Arm 寄存器.那是,CPU内部.和GPIO注册所有外设. 换句话说,要是arm的cpu,它包含了其他芯片公司将有R0-R37,和GPIO有. 版权声明:本文博主原创文章.博客,未经同 ...

  10. Codeforces Round #243 (Div. 2) Problem B - Sereja and Mirroring 解读

    http://codeforces.com/contest/426/problem/B 对称标题的意思大概是.应当指出的,当线数为奇数时,答案是线路本身的数 #include<iostream& ...