Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

在一片茂密的原始森林中,生物学家们发现了几种远古时期的动物化石。他们将化石依次编号为1,2,3,……n-1,n,然后带回实验室。

经过简单的分析,他们发现了一些规律:若动物A是由动物B经过若干次进化而成的,则称B是A的祖先,特别地,任意一种动物都

是它自己的祖先(经过0次进化);若动物A是由动物B经过一次进化而成的,则称B是A的直系祖先;1号动物无直系祖先,其它每

种动物都有且仅有一个直系祖先;发现的动物化石中,1号的是它们共同的祖先;所有的动物都是从低级向高级进化。

为了进一步确定生物进化的过程,生物学家们经过复杂的分析和计算,得出这些化石两两间的“差异程度”。“差异程度”有如

下性质:对于两个物种i,j,它们的“差异程度”是一个非负整数,记为Dij;Dii=0,i<>j时,Dij=Dji<>0;若i是k的祖先,k

是j的祖先则Dij=Dik+Dkj;若k是i和j的所有公共祖先中最高级的,则Dij=Dik+Dkj。因此,利用“差异程度”,就可以确定生

物进化的过程。

但是化石数量实在太多了,于是,生物学家们希望你能够帮助他们。

【输入格式】

输入文件evolve.in。第一行是一个整数n(1<=n<=100),表示化石种类数。接下来n行,每行n个整数,第i行第j个是Dij(0<=Dij<=100000),表示i和j的“差异程度”。

【输出格式】

输出文件evolve.out。n-1行,第i行是一个整数c,表示i+1号动物的直系祖先为c。

【数据规模】

Sample Input1

4

0 1 4 7

1 0 5 8

4 5 0 3

7 8 3 0

Sample Output1

1

1

3

【题目链接】:http://noi.qz5z.com/viewtask.asp?ID=u247

【题解】



这是个普利姆算法的模板题,但不好想;

题目中提到了1号节点是所有节点的祖先->那么这个1号节点肯定是最后形成的树的根节点(为什么是树?因为有说每个节点只有一个直系祖先!,最后形成的直系祖先树肯定只有n-1条边);

在做普利姆算法的时候,我们会先加入第一个节点(1号);然后查看与1号节点相连的点;

扩展当前形成的最小生成树内所有的节点(一开始只有1号节点)与那些能够通过这个生成树里面的某个点通过一条边直接到达的点最小的距离;放在dis里面;

则我们在用普利姆做扩展的时候;

会把其他节点加入到这个生成树中->为什么是选择离该节点最近的边?因为有说i->k->j(箭头表示x是y的父亲)有dis[i][j] = dis[i][k]+dis[k][j];则两个直系关系dis[i][j]肯定是i的出边里面边权最小的(尽量最小);

在加入的过程中可以保证那个新加入的节点是1号节点的子代节点(保证1号节点是所有节点的祖先);

然后这个点到生成树的某个点的距离是其他不在生成树里面的点距离生成树的某个点的距离中最短的;

这就保证了我们要连的边是一个直系的关系;再用这个新加入的点更新整个生成树到其他不在生成树里面的点的距离就好(尝试);

好恶心啊;蒟蒻都不会。



【完整代码】

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <string>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second typedef pair<int,int> pii;
typedef pair<LL,LL> pll; void rel(LL &r)
{
r = 0;
char t = getchar();
while (!isdigit(t) && t!='-') t = getchar();
LL sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
} void rei(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)&&t!='-') t = getchar();
int sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
} const int INF = 0x3f3f3f3f;
const int MAXN = 110;
const int dx[5] = {0,1,-1,0,0};
const int dy[5] = {0,0,0,-1,1};
const double pi = acos(-1.0);
int dis[MAXN],n;
int w[MAXN][MAXN],pre[MAXN];
bool in[MAXN]; int main()
{
//freopen("F:\\rush.txt","r",stdin);
rei(n);
rep1(i,1,n)
rep1(j,1,n)
rei(w[i][j]);
memset(in,false,sizeof(in));
memset(dis,INF,sizeof(dis));
dis[1] = 0;
rep1(i,1,n)
{
int k = 0,mi = INF;
rep1(j,1,n)
if (!in[j] && dis[j]<mi)
{
k = j;mi = dis[j];
}
if (k==0)
break;
in[k] = true;
rep1(j,1,n)
if (!in[j] && dis[j] > w[k][j])
{
dis[j] = w[k][j];
pre[j] = k;
}
}
rep1(i,2,n)
cout << pre[i]<<endl;
return 0;
}

【u247】生物进化的更多相关文章

  1. CMA-ES 算法

    CMA-ES 算法 一.算法介绍 CMA-ES是Covariance Matrix Adaptation Evolutionary Strategies的缩写,中文名称是协方差矩阵自适应进化策略,主要 ...

  2. 差分进化算法 DE-Differential Evolution

    差分进化算法 (Differential Evolution)   Differential Evolution(DE)是由Storn等人于1995年提出的,和其它演化算法一样,DE是一种模拟生物进化 ...

  3. [Evolutionary Algorithm] 进化算法简介

    进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编 ...

  4. GA算法-R语言实现

    旅行商问题 北工商-经研143班共有30位同学,来自22个地区,我们希望在假期来一次说走就走的旅行,将所有同学的家乡走一遍.算起来,路费是一笔很大的花销,所以希望设计一个旅行方案,确保这一趟走下来的总 ...

  5. Deep learning:四十一(Dropout简单理解)

    前言 训练神经网络模型时,如果训练样本较少,为了防止模型过拟合,Dropout可以作为一种trikc供选择.Dropout是hintion最近2年提出的,源于其文章Improving neural n ...

  6. 非编码RNA

    生命的基本过程是从DNA转录成mRNA,再翻译成蛋白质发挥功能.DNA就像一张绝密的密码图,不能随意被移动,只能被锁在细胞核里.要想知道这些密码,只能像复印一样,将密码图复印到mRNA上,由它们把这些 ...

  7. [CS231n-CNN] Training Neural Networks Part 1 : parameter updates, ensembles, dropout

    课程主页:http://cs231n.stanford.edu/ ___________________________________________________________________ ...

  8. DependencyProperty深入浅出

    写这篇心得之前,看到博友一句话:需求是推动发展的原动力. 说得好,说的棒,说到了点子上,说到了心里去: 好我们开始 最初的世界是简单的,甚至比单细胞动物还简单: 普通属性定义 public class ...

  9. 【Todo】【转载】深度学习&神经网络 科普及八卦 学习笔记 & GPU & SIMD

    上一篇文章提到了数据挖掘.机器学习.深度学习的区别:http://www.cnblogs.com/charlesblc/p/6159355.html 深度学习具体的内容可以看这里: 参考了这篇文章:h ...

随机推荐

  1. Java_Learn

    20180417 集合类 Collection 如果是实现了list接口的集合类,具备的特点是有序,可重复: 如果是实现了set接口的集合类,具备的特点是无序,不可重复: Collection中的方法 ...

  2. ErrorSet

    1.获取路径的失误: 例子是对一个列表项的悬浮操作: ~(function() { var lists = $(".footer_log>li"); lists.each(f ...

  3. Ubuntu+PyQt5+Python3.6+Qt Designer 实现可视化窗口的编辑

    一.为什么写这片博文 近期将实验室的电脑的OS换成了ubuntu,想对linux进一步的了解和使用.在使用的过程中想用python+pyqt5写一个音乐播放器和视频播放器(这也是linux的乐趣所在) ...

  4. mysql 编码错误修改

    set character_set_results=utf8;

  5. Gym - 100502A Amanda Lounges

    Amanda Lounges Time Limit: 1000MS   Memory Limit: 524288KB   64bit IO Format: %I64d & %I64u AMAN ...

  6. 学习WWDC的好资源!

    学习WWDC的好资源. 大家都知道.要看Apple每年一度的WWDC,仅仅要到它的Developer站点去就能够了.那里有每年的研讨会视频,并且还能够下载每一个视频的SD或HD视频文件,以及相关的演示 ...

  7. 2、TaskFactory类

    使用实例化的TaskFactory类,在其中把TaskMethod方法传递给StartNew()方法,就会立即启动任务. 1: TaskFactory tf = new TaskFactory(); ...

  8. Spider_reg

    # 解析 数据的分类 结构化数据 有固定的格式,如 :HTML.XML.JSON 非结构化数据 图片.音频.视频,这类数据一般都存储为二进制 # 正则表达式 re 使用流程 创建编译对象:p = re ...

  9. 设计模式六大原则(二):里氏替换原则(Liskov Substitution Principle)

    里氏替换原则(LSP)由来: 最早是在 妖久八八 年, 由麻神理工学院得一个女士所提出来的. 定义: 1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 ...

  10. spring+mybatis+Atomikos JTA事务配置说明

    一.概览 Atomikos是一个公司名字,旗下最著名的莫过于其Atomikos的事务管理器产品.产品分两个:一个是开源的TransactionEssentials,一个是商业的ExtremeTrans ...