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. JavaScript--数据结构算法之链表

    数组的缺点:数组的长度固定,增删时比较困难要移动元素,而且数据填满再添加元素比较复杂.js:数组有split(),可以任意的分割.不存在上述问题.主要问题是:js数组都被实现成了对象,和其他语言的数组 ...

  2. traceroute----追踪数据包在网络上的传输过程

    traceroute命令 用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节. traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间.一条路径上的每 ...

  3. Android自定义视图

    Android框架为我们提供了大量的视图类来帮助我们做好展示信息以及同用户进行交互的工作.然后有时候,我们的app或许需要一些在Android内建视图之外特殊的视图,那么此时我们就需要自定义视图.下面 ...

  4. tokumx的安装和使用

    Add the Tokutek package signing key. $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key ...

  5. 使用Notepad++的XML Tools插件格式化XML文件

    转自“”:https://blog.csdn.net/qq_36279445/article/details/79803310 1. 安装XML Tools插件 (1) 通过网址http://sour ...

  6. using可以用于释放操作,相当于Dispose()

    using可以用于释放操作,相当于Dispose()

  7. jsp 用shiro 的判断 是否有菜单查看的权限

    实例:spring-shiro.xml 123 /admin/repairType/index = roles["ROLE_ADMIN"]/admin/user=roles[&qu ...

  8. 【Java】Java Socket 通信演示样例

    用socket(套接字)实现client与服务端的通信. 这里举两个样例: 第一种是每次client发送一个数据,服务端就做一个应答. (也就是要轮流发) 另外一种是client能够连续的向服务端发数 ...

  9. 报错 关于python的x和y不等长

    ValueError: shape mismatch: objects cannot be broadcast to a single shape 这个错误可能是因为传入的两个参数数据长度不一样,比如 ...

  10. nuxt使用QRCode.js 生成二维码

    QRCode.js 是一个用于生成二维码图片的插件, 官方文档 . 我是在nuxt.js(vue官方的服务端渲染方式)项目里使用的QRCode.js: 第一步:看官方文档: 第二步:下载QRCode. ...