HDU 1875 最小生成树prim算法
生活随笔
收集整理的這篇文章主要介紹了
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算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: README.md使用
- 下一篇: Visible Ops