【u247】生物进化
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】生物进化的更多相关文章
- CMA-ES 算法
CMA-ES 算法 一.算法介绍 CMA-ES是Covariance Matrix Adaptation Evolutionary Strategies的缩写,中文名称是协方差矩阵自适应进化策略,主要 ...
- 差分进化算法 DE-Differential Evolution
差分进化算法 (Differential Evolution) Differential Evolution(DE)是由Storn等人于1995年提出的,和其它演化算法一样,DE是一种模拟生物进化 ...
- [Evolutionary Algorithm] 进化算法简介
进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编 ...
- GA算法-R语言实现
旅行商问题 北工商-经研143班共有30位同学,来自22个地区,我们希望在假期来一次说走就走的旅行,将所有同学的家乡走一遍.算起来,路费是一笔很大的花销,所以希望设计一个旅行方案,确保这一趟走下来的总 ...
- Deep learning:四十一(Dropout简单理解)
前言 训练神经网络模型时,如果训练样本较少,为了防止模型过拟合,Dropout可以作为一种trikc供选择.Dropout是hintion最近2年提出的,源于其文章Improving neural n ...
- 非编码RNA
生命的基本过程是从DNA转录成mRNA,再翻译成蛋白质发挥功能.DNA就像一张绝密的密码图,不能随意被移动,只能被锁在细胞核里.要想知道这些密码,只能像复印一样,将密码图复印到mRNA上,由它们把这些 ...
- [CS231n-CNN] Training Neural Networks Part 1 : parameter updates, ensembles, dropout
课程主页:http://cs231n.stanford.edu/ ___________________________________________________________________ ...
- DependencyProperty深入浅出
写这篇心得之前,看到博友一句话:需求是推动发展的原动力. 说得好,说的棒,说到了点子上,说到了心里去: 好我们开始 最初的世界是简单的,甚至比单细胞动物还简单: 普通属性定义 public class ...
- 【Todo】【转载】深度学习&神经网络 科普及八卦 学习笔记 & GPU & SIMD
上一篇文章提到了数据挖掘.机器学习.深度学习的区别:http://www.cnblogs.com/charlesblc/p/6159355.html 深度学习具体的内容可以看这里: 参考了这篇文章:h ...
随机推荐
- Django模型三
关联对象操作及多表查询 关联表的数据操作: 一对多: 正向:如果一个模型有外键字段,通过这个模型对外键进行操作叫做正向. 更新: 通过属性赋值 In [1]: from teacher.models ...
- 谈谈Spine动画在产品中的应用
笔者介绍:姜雪伟,IT公司技术合伙人.IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...
- Vue Invalid handler for event "": got undefined
原因:绑定的方法不是放在methods:{}里.比如我把绑定的函数写在了computed:{}里就会报这个错.
- 【例7-15 UVA-1603】Square Destroyer
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先预处理出所有的正方形(长度为1,2...n的)所包含哪些边. 然后记录每个正方形的应有边长和实际边长(有些边被删掉了); 然后搜的 ...
- 为什么在AJAX里面直接return 一个值,接受不到?
1.AJAX是异步执行流程,后面的代码可能会先一步执行.把异步改为同步. 2.JS函数作用域问题,现在外面声明一个全局变量,等success后再把值给变量,这样就可以return 值了.
- vue实现多语言国际化(vue-i18n),结合element ui、vue-router、echarts以及joint等。
老板说我们的项目要和国际接轨,于是乎,加上了多语言(vue-i18n).项目用到的UI框架是element ui ,后续echarts.joint等全都得加上多语言. 一.言归正传,i18n在vue项 ...
- Java Web学习总结(16)——JSP的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- HDU——T 3501 Calculation 2
http://acm.hdu.edu.cn/showproblem.php?pid=3501 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- 洛谷 P1211 [USACO1.3]牛式 Prime Cryptarithm
P1211 [USACO1.3]牛式 Prime Cryptarithm 题目描述 下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式. *** x ** ...
- [Angular] Http Custom Headers and RequestOptions
updatePassenger(passenger: Passenger): Observable<Passenger> { let headers = new Headers({ 'Co ...