模板题(最短生成树prim算法)
程序员文章站
2022-05-30 08:21:50
...
题目链接:HDOJ1875
#include<bits/stdc++.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
typedef struct Island
{
int x;
int y;
}island;
double mmap[105][105];
island dao[105];
double distant(island *a,island *b)
{
double len;
int ax=a->x;
int ay=a->y;
int bx=b->x;
int by=b->y;
int temp=(ax-bx)*(ax-bx)+(ay-by)*(ay-by);
len=sqrt(temp);
if(len>1000||len<10)
len=inf;
return len;
}
int main()
{
int T;//测试数
int c;//小岛数
int innum;//记录包含在生成树中的点的个数
double route;//记录生成树长度
double spend;//记录花费
double dis[101];//记录所有顶点到当前生成树的最短路
int tree[101];//记录结点是否已经包含在当前最短路中
cin>>T;
while(T--){
cin>>c;
fill(dis+1,dis+1+c,inf);//+1的原因是因为我们这里假设数组从下标1开始计数
fill(tree+1,tree+1+c,0);//初始时生成树为空
route=0;
innum=0;
spend=0;
for(int i=1; i<=c; i++)
{
cin>>dao[i].x;
cin>>dao[i].y;
}
//构图
for(int i=1; i<=c; i++)
{
for(int j=i; j<=c; j++)
{
mmap[i][j]=mmap[j][i]=distant(&dao[i],&dao[j]);
}
}
//最小生成树
tree[1]=1;//先把1号点放入生成树
for(int i=1; i<=c; i++)
{
dis[i]=mmap[1][i];
}
innum++;
while(innum<c)
{
double mmin=inf;
int nextin=0;//0号是一个特殊点(哨兵点),实际没有这个点
for(int i=1; i<=c; i++)
{
if(tree[i]==0&&dis[i]<mmin)
{
mmin=dis[i];
nextin=i;
}
}
if(nextin==0)
break;
else
{
innum++;
route+=mmin;//更新最小生成树的长度
tree[nextin]=1;//把nextin放入生成树
//更新dis数组
for(int i=1; i<=c; i++)
{
if(tree[i]==0&&mmap[nextin][i]<dis[i])
dis[i]=mmap[nextin][i];
}
}
}
if(innum!=c)
cout<<"oh!"<<endl;
else
{
spend=route*100;
printf("%.1f\n",spend);
}
}
return 0;
}
上一篇: 【Kotlin】自定义View(二)
下一篇: 有幽默感的夫妻,生活特幸福
推荐阅读
-
JS使用Prim算法和Kruskal算法实现最小生成树
-
JS使用Prim算法和Kruskal算法实现最小生成树
-
图论小结(一)包括一些最短路,最小生成树,差分约束,欧拉回路,的经典题和变种题。强连通,双连通,割点割桥的应用。二分匹配
-
python最小生成树kruskal与prim算法详解
-
洛谷P3366 【模板】最小生成树(Boruvka算法)
-
最小生成树的两种方法(Kruskal算法和Prim算法)
-
洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题
-
c/c++ 用普利姆(prim)算法构造最小生成树
-
prim(最小生成树模板)
-
POJ - 1251 Jungle Roads(最小生成树算法:Kruskal和Prim算法)