POJ3771+Prim
最小生成树的应用
数据量小。
/*
Prim
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<math.h>
using namespace std;
typedef long long int64;
//typedef __int64 int64;
typedef pair<int64,int64> PII;
#define MP(a,b) make_pair((a),(b))
const int maxn = 55;
const double inf = 99999999;
const double pi=acos(-1.0);
const double eps = 1e-8; struct Node{
double x,y;
}pnt[ maxn ];
double dis[ maxn ];
bool vis[ maxn ];
double mat[ maxn ][ maxn ];
double dist( int a,int b ){
return sqrt( (pnt[a].x-pnt[b].x)*(pnt[a].x-pnt[b].x)+(pnt[a].y-pnt[b].y)*(pnt[a].y-pnt[b].y) );
} double Prim( int start,int aim,int n ){
double ans = 0;
memset( vis,false,sizeof( vis ) );
vis[ start ] = true;
vis[ aim ] = true;
for( int i=0;i<n;i++ ){
dis[ i ] = mat[ start ][ i ];
}
for( int i=0;i<n;i++ ){
int id = -1;
double M = inf;
for( int j=0;j<n;j++ ){
if( vis[ j ]==false&&M>dis[ j ] ){
M = dis[ j ];
id = j;
}
}
if( id==-1 ) break;
vis[ id ] = true;
ans += M;
for( int j=0;j<n;j++ ){
if( vis[ j ]==false&&dis[ j ]>mat[ id ][ j ] ){
dis[ j ] = mat[ id ][ j ];
}
}
}
return ans ;
} int main(){
int T;
scanf("%d",&T);
while( T-- ){
int n;
scanf("%d",&n);
for( int i=0;i<n;i++ ){
scanf("%lf%lf",&pnt[i].x,&pnt[i].y);
}
if( n==1 ){
puts("0");
continue;
}
for( int i=0;i<n;i++ ){
for( int j=0;j<n;j++ ){
if( i==j )
mat[i][j] = 0.0;
else
mat[i][j] = dist( i,j );
}
}
double res = inf;
for( int i=0;i<n;i++ ){
res = min( res,Prim( (i+1)%n,i,n ) );
}
printf("%.2lf\n",res);
}
return 0;
}
POJ3771+Prim的更多相关文章
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- 最小生成树(prim&kruskal)
最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改.先把算法过程记下来: prime算法: 原始的加权连通图——————D被选作起点,选与之相连的权值 ...
- Prim 最小生成树算法
Prim 算法是一种解决最小生成树问题(Minimum Spanning Tree)的算法.和 Kruskal 算法类似,Prim 算法的设计也是基于贪心算法(Greedy algorithm). P ...
- poj1789--最小生成树(prim)
水题... 题目大意: 用一个7位的字符串代表一个编号,两个编号之间的distance代表这两个编号之间不同字母的个数.一个编号只能由另一个编号“衍生”出来,代价是这两个编号之间相应的distance ...
- 最小生成树のprim算法
Problem A Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Sub ...
- poj2485 kruskal与prim
Kruskal: #include<iostream> #include<cstdio> #include<algorithm> using namespace s ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 最小生成树——prim算法
prim算法是选取任意一个顶点作为树的一个节点,然后贪心的选取离这棵树最近的点,直到连上所有的点并且不够成环,它的时间复杂度为o(v^2) #include<iostream>#inclu ...
随机推荐
- eclipse 快捷键汇总
1几个最重要的快捷键 代码助手:Ctrl+Space(简体中文操作系统是Alt+/)快速修正:Ctrl+1单词补全:Alt+/打开外部Java文档:Shift+F2 显示搜索对话框:Ctrl+H快速O ...
- SQL Server用户自定义类型与统计信息
用户自定义数据类型不支持统计信息! 所以查询对它的查询会慢一些.
- android 添加左右滑屏手势
今天要在自己的项目中添加左右滑动,实现日期的加减(原来已经做了加减按键).滑动在一个中间的layout中进行 思路:添加左右划屏幕判断,得到判断后模拟加减按键按下. 模拟按键按下用 mbotton.p ...
- Android updater-scripts(Edify Script)各函数详细说明(转)
这是Android系统来运行updater-scripts的Edify语言的基本介绍. 大部分的Edify命名都是函数,当调用这些函数结束的时候,会返回数据给脚本.当然,你也可以使用这些函数的返回值来 ...
- rsyslog ~ 波浪号
<pre name="code" class="html">Using negation can be useful if you would li ...
- html5的在ie6,7,8兼容
<script> //html5 标签 (function () { if (!/*@cc_on!@*/0) return; var html5 = "abbr,article, ...
- switch case default 的使用
switch_case从页面输入五个同学的成绩,求出平均成绩,如果大于等于90为优秀,小于90大于等于80为良好,小于80大于等于70为一般,小于70大于等于60为较差,小于60为很差 SWITCH语 ...
- 第一个输出程序 Console.WriteLine
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C++_知识点_结构体/枚举/联合
//C++中结构体的不同之处 #include <iostream> #include <string> using namespace std; int main(void) ...
- static_cast,const_cast,dynamic_cast,reinterpret_cast
除非必要,尽量不要对变量进行强制转换.这是因为强制转换是存在风险的,但实际上在某种情况下,转型是必需的. 旧式C转型方式为(type)expression,即由一对小括号加上一个对象名称组成,而这种语 ...