题意简述:给定若干个相同维度的向量,寻找一种排序方法,使得所有向量的表示长度总和最低。 所谓表示长度为(Aj-r*Ai)^2,其中i<j 

数据范围:向量总数和维度均小于100

思路:(1)首先Ai和Aj确定后,最小表示长度是可以在线性时间计算出来的。使用简单的二次函数分析方法即可。

(2)上述可以得出任意两向量之间的距离,即为图中的边,于是问题可以转化为有向图的“最小树形图”,i到j的有向边权值即为用Aj表示Ai的最小表示长度。

(3)朱-刘算法简述: 首先对除根以外的点选择一条权值最小的边,如果没有构成环且没有孤立点则找到了答案。

如果存在环,则将环缩为一个新的点 然后更新所有的边权

设环中的点有(Vk1,Vk2,… ,Vki)总共i个,用缩成的点叫Vk替代,则在压缩后的图中,其他所有不在环中点v到Vk的距离定义如下:
                   gh[v][Vk]=min { gh[v][Vkj]-mincost[Vkj] } (1<=j<=i)//由于选择入边必然放弃Vkj之前选择的入边,所以要减去mincost[Vkj]

而Vk到v的距离为
                  gh[Vk][v]=min { gh[Vkj][v] }              (1<=j<=i)

直到不存在环算法结束得到最优解。

(4)本题向量序列是任意的,所以对应生成树的根是不确定的,我们可以枚举根,但是复杂度太高。

             此时我们引入一个 零向量 作为树根 显然任何向量由零向量表示的结果都是最差的,所以对其他的所有点直接运行朱刘算法就可以得到解了。

PS:这个题用cout输出会WE。。 必须用printf

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
using namespace std; struct edge
{
int begin;int end;
}; const int maxx=;
bool vis[maxx],indfs[maxx];
vector<double>zero;
int n,m,root;
vector<vector<double> >vec;
double cost[maxx][maxx],Cost[maxx][maxx];
bool operator <(const edge a,const edge b)
{
double ac=cost[a.begin][a.end];double bc=cost[b.begin][b.end];
return ac>bc;//从小到大排序
};
priority_queue<edge>que[maxx];
double minv(vector<double> a,vector<double> b)
{
double ab=,bsqrt=,asqrt=;
for(int i=;i<a.size();i++)
{ab+=a[i]*b[i];bsqrt+=b[i]*b[i];asqrt+=a[i]*a[i];} if((bsqrt-0.0)<1e-)return asqrt;
return asqrt-(ab*ab/bsqrt);
}
int belongcircle[maxx];
int findbelong(int x)
{
if(x==belongcircle[x])return x;
else return belongcircle[x]=findbelong(belongcircle[x]);
} double ans,ansnow;
double min(double a,double b)
{
if(a<b)return a;
else return b;
}
void combinecircle(int now,int begin)
{
now=findbelong(now);
if(vis[now])return ;
vis[now]=true;
edge e1=que[now].top();
double coste=cost[findbelong(e1.begin)][findbelong(e1.end)];
ansnow+=coste;
bool finish[maxx];
memset(finish,,sizeof(finish));
for(int i=;i<=m;i++)
{
int po=findbelong(i);
if(po==now||po==begin)continue;
if(finish[po])continue;
finish[po]=true;
cost[begin][po]=min(cost[begin][po],cost[now][po]-coste);
cost[po][begin]=min(cost[po][begin],cost[po][now]);
}
belongcircle[now]=begin;
combinecircle(e1.end,begin);
return ;
}
void build();
bool findcircle(int now)
{
if(now==root)return false;
now=findbelong(now);
if(indfs[now])
{
memset(vis,,sizeof(vis));
combinecircle(now,now);
build();
return true;
}
indfs[now]=true;
return findcircle(que[now].top().end);
} void build()
{
bool finish[maxx];
memset(finish,,sizeof(finish));
for(int i=;i<m;i++)
{
int po=findbelong(i);
if(finish[po])continue;
finish[po]=true;
while(!que[po].empty())que[po].pop();
for(int j=;j<=m;j++)
{
int pb=findbelong(j);
if(po==pb)continue;
edge en;en.begin=po;en.end=pb;
que[po].push(en);
}
}
return ;
}
bool counted[maxx];
int main()
{freopen("1.txt","r",stdin);
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<n;i++)
zero.push_back(0.0);
for(int i=;i<m;i++)
{
vector<double>nowv;
for(int j=;j<n;j++)
{ double nv;cin>>nv;nowv.push_back(nv);}
vec.push_back(nowv);
}
vec.push_back(zero);
for(int i=;i<=m;i++)
for(int j=;j<=m;j++)
{ cost[i][j]=minv(vec[i],vec[j]);}
root=m;
ansnow=;
belongcircle[root]=root;
for(int i=;i<m;i++)
{
belongcircle[i]=i;
}
bool exis=false;
do
{
build();
exis=false;
bool finish[maxx];
memset(finish,,sizeof(finish));
for(int i=;i<m;i++)
{
int po=findbelong(i);
if(finish[po])continue;
memset(indfs,,sizeof(indfs));
exis=findcircle(po);
finish[po]=true;
}
}while(exis);
memset(counted,,sizeof(counted));
for(int i=;i<m;i++)
{
int po=findbelong(i);
if(counted[po])continue;
counted[po]=true;
ansnow+=cost[findbelong(que[po].top().begin)][findbelong(que[po].top().end)];
}
printf("%lf\n",ansnow);
return ;
}

代码比较乱。。

AIZU AOJ 2309 Vector Compression 最小树形图(朱—刘算法)的更多相关文章

  1. 最小树形图——朱刘算法(Edmonds)

    定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 朱刘算法实现过程: [在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图] 1,选入 ...

  2. POJ 3164 Command Network ( 最小树形图 朱刘算法)

    题目链接 Description After a long lasting war on words, a war on arms finally breaks out between littlek ...

  3. poj3164(最小树形图&朱刘算法模板)

    题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...

  4. POJ 3164 Command Network 最小树形图 朱刘算法

    =============== 分割线之下摘自Sasuke_SCUT的blog============= 最 小树形图,就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T, ...

  5. 最小树形图--朱刘算法([JSOI2008]小店购物)

    题面 luogu Sol 首先设一个 \(0\) 号点,向所有点连边,表示初始价值 显然这个图的一个 \(0\) 为根的最小有向生成树的边权和就是每个买一次的最小价值 再买就一定能优惠(包含 \(0\ ...

  6. 洛谷P4716 【模板】最小树形图(朱刘算法)

    题意 题目链接 Sol 朱刘算法?感觉又是一种神仙贪心算法 大概就是每次贪心的用每个点边权最小的入边更新答案,如果不行的话就缩起来找其他的边 不详细说了,丢链接走人.. #include<bit ...

  7. POJ - 3164-Command Network 最小树形图——朱刘算法

    POJ - 3164 题意: 一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 题目就是求这个最小的树形图. 参考资料:https://blog.csdn.net/ ...

  8. bzoj 4349 最小树形图——朱刘算法

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4349. 学习博客:http://www.cnblogs.com/xzxl/p/7243466 ...

  9. poj 3164 Command Network (朱刘算法)

    题目链接: http://poj.org/problem?id=3164 题目大意: 有n个点(用坐标表示)各点编号分别为1—>n,m条单向路,问能否存在一个花费价值最小的网络,能使从1点到达任 ...

随机推荐

  1. JavaScript中整型数据使用

    JavaScript中整型数据使用 制作人:全心全意 JavaScript的数字格式允许精确地表示-900719925474092(-253)和900719925474092(253)之间的所有整数, ...

  2. Nginx的初识

    今日刚接触了解到Nginx的反向代理,正向代理,并发,集群,同个站点不同域名的解析访问等等. 1.反向代理:Nginx充当一个桥接的作用,对用户和服务端进行链接,进行服务端的代理,这样有什么好处: a ...

  3. 版本控制git之一 仓库管理 安装 基础

      版本控制git之一-仓库管理 git ​ 再开始这个话题之前,让我想起了一件很痛苦的事情,在我大学写毕业论文的时候,我当时的文件是这样保存的 毕业论文_初稿.doc 毕业论文_修改1.doc 毕业 ...

  4. IIS 注册.NET Framework 4.0 命令

    cmd执行以下命令 32位Windows:C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i 64位Windows:C ...

  5. jQuery_DOM学习之------包裹元素的方法

    1..wrap( ):在集合中匹配的每个元素周围包裹一个HTML结构 简单的看一段代码: <span>连接文字</span> 给span元素增加一个a包裹 $('span'). ...

  6. hdu 4770 状压+枚举

    /* 长记性了,以后对大数组初始化要注意了!140ms 原来是对vis数组进行每次初始化,每次初始化要200*200的复杂度 一直超时,发现没必要这样,直接标记点就行了,只需要一个15的数组用来标记, ...

  7. Linux下汇编语言学习笔记60 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  8. Codeforces 631C Report【其他】

    题意: 给定序列,将前a个数进行逆序或正序排列,多次操作后,求最终得到的序列. 分析: 仔细分析可以想到j<i,且rj小于ri的操作是没有意义的,对于每个i把类似j的操作删去(这里可以用mult ...

  9. JSP的Cookie处理

    以下内容引用自http://wiki.jikexueyuan.com/project/jsp/Cookies-handling.html: Cookies是存储在客户端计算机的文本文件,保存各种跟踪目 ...

  10. Mac 系统引导过程概述 & BootCamp 的秘密

    http://bbs.feng.com/read-htm-tid-6890655.html