日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 1875 最小生成树prim算法

發布時間:2023/12/18 编程问答 30 如意码农
生活随笔 收集整理的這篇文章主要介紹了 HDU 1875 最小生成树prim算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define MAX 0xffffffff //定義一個最小生成樹中不可能達到的值
const int qq=+; // 點的上限
using namespace std;
struct point{
int x,y;
}node[qq];
double lowcost[qq][qq]; // 鄰接矩陣
int vis[qq]; // 最小生成樹的點集合vis數組
int n;
double f(point a,point b)
{
return sqrt(pow(a.x-b.x,2.0)+pow(a.y-b.y,2.0));
}
void build()
{
double len;
for(int j,i=;i<n;++i)
for(j=i;j<n;++j){
len=f(node[i],node[j]); // 計算兩點之間的距離也就是點與點的權值、
if(len>=&&len<=)
lowcost[i][j]=lowcost[j][i]=(i==j)?:len;
else
lowcost[i][j]=lowcost[j][i]=MAX; // 值為MAX 意味著這兩點不連通、
}
}
void prim()
{
int k,t=n;
double min,tot=;
vis[]=; //初始點0進入最小生成樹數組中、
while(--t){
min=MAX;
for(int i=;i<n;++i){
if(vis[i]!=&&lowcost[][i]<min){ //lowcost[0]代表當前的最小生成樹的最小權值數組、
min=lowcost[][i]; //找到當前最小的權值并記錄是哪一個點、
k=i;
}
}
if(min==MAX) break; //如果最小權值都為MAX 也就是不連通也可以跳出循環了、
vis[k]=; // 點k進入最小生成樹數組、
tot+=min; //統計權值、
for(int i=;i<n;++i) //因為加入了一個點到最小生成樹中,所以要更新當前的最小權值數組、
if(vis[i]!=&&lowcost[k][i]<lowcost[][i])
lowcost[][i]=lowcost[k][i];
}
if(t==) printf("%.1f\n",tot*);
else printf("oh!\n");
}
int main()
{
int t;cin >> t;
while(t--){
memset(vis,,sizeof(vis)); //清空標記數組、
scanf("%d",&n);
for(int i=;i<n;++i)
scanf("%d%d",&node[i].x,&node[i].y);
build();
prim();
}
}

剛做這題我模型沒轉換過來,以為只要把橫坐標按從小到大排序,橫坐標相同就按縱坐標從小到大排序然后然后從左到右從下道上連接各點就是最小生成樹、

- - 、 錯的太離譜了,代碼就不拿出來丟臉了

題目設置的限制條件實際上就是不連通,這點想通了就好做了

總結

以上是生活随笔為你收集整理的HDU 1875 最小生成树prim算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。