1. 程式人生 > 實用技巧 >組合語言51微控制器-第一天

組合語言51微控制器-第一天

題目傳送:https://loj.ac/p/10065

1、排序函式sort,任何一種排序演算法都行,下面的示例程式碼中,我採用的是氣泡排序演算法

2、尋源函式getRoot,尋找某一個點在並查集中的根,注意,是根,不是雙親!,所以,判斷的條件為如果某一個下標的值就是其本身,設a為並查集陣列,v為陣列值,如果a[v] = v,它就是根,否則就讓v = a[v],向上尋找,直到其相等。

1圖的儲存結構(a,b為邊的兩個頂點,w為邊的權值),初始化

2.排序sort函式(按照權值從小到大)

3.getRoot尋源函式(v為並查集,x為待查頂點)

4.for迴圈遍歷

 1 #include <bits/stdc++.h>
 2
using namespace std; 3 #define x first 4 #define y second 5 const int mx= 250100; 6 int n,k; 7 typedef pair<int,int> PII; 8 struct node{ 9 int x,y; 10 double z; 11 }; 12 bool operator <(node &a,node &b) 13 { 14 return a.z<b.z; 15 } 16 17 int f[mx]; 18 PII q[mx];
19 node edge[mx]; 20 21 int get(int x) 22 { 23 return x==f[x]?x:get(f[x]); 24 } 25 26 double getdist(PII a,PII b) 27 { 28 int dx=a.x-b.x; 29 int dy=a.y-b.y; 30 return sqrt(dx*dx+dy*dy); 31 } 32 33 int main() 34 { 35 cin>>n>>k; 36 for(int i=1;i<=n;i++) 37 {
38 cin>>q[i].x>>q[i].y; 39 } 40 int m=0; 41 for(int i=1;i<=n;i++) 42 { 43 for(int j=1;j<=i;j++) 44 { 45 edge[++m].x=i; 46 edge[m].y=j; 47 edge[m].z=getdist(q[i],q[j]); 48 } 49 } 50 sort(edge+1,edge+1+m); 51 for(int i=1;i<=m;i++) f[i]=i; 52 int cnt=n; 53 double ans=0; 54 for(int i=1;i<=m;i++) 55 { 56 if(cnt<=k) break; 57 int a=get(edge[i].x),b=get(edge[i].y); 58 double w=edge[i].z; 59 if(a!=b) 60 { 61 f[a]=b; 62 cnt--; 63 ans=w; 64 } 65 } 66 printf("%.2lf\n",ans); 67 }