連結地址:
http://acm.hdu.edu.cn/showproblem.php?pid=3405
題目意思是找一個MST,但是不是n個點的,是n-1個點的,另一個點孤立
我是把n個點,每一個點都孤立一次,算出所有的MST的最短路徑,最後找出最小值
代碼#include <cstdlib><br />#include <cmath><br />#include <algorithm><br />#include <vector><br />#include <iostream><br />#include <cstdio><br />using namespace std;<br />#include <cstring><br />const int INF=20000000;<br />typedef struct<br />{<br /> int x,y;<br />} node;<br />node t[51];<br />int map[51][51];<br />int shst[51];<br />bool used[51];<br />int n;<br />inline int dist(int i,int j)<br />{<br /> int tt;<br /> tt=(t[i].x-t[j].x)*(t[i].x-t[j].x)+(t[i].y-t[j].y)*(t[i].y-t[j].y);<br /> return tt;<br />}<br />void input()<br />{<br /> for(int i=1;i<=n;i++)<br /> {<br /> scanf("%d %d",&t[i].x,&t[i].y);<br /> }<br /> for(int i=1;i<=n;i++)<br /> for(int j=1;j<=i;j++)<br /> {<br /> if(i!=j)<br /> {<br /> map[j][i]=map[i][j]=dist(i,j);<br /> }<br /> else<br /> map[i][j]=0;<br /> }<br />}</p><p>double solve(int u)///u 為孤立的island<br />{<br /> int start;<br /> int i,j,k,kk;<br /> for(i=1;i<=n;i++)<br /> used[i]=false;<br /> used[u]=true;<br /> if(u!=1) start=1;<br /> else start=2;<br /> for(i=1;i<=n;i++)<br /> shst[i]=map[start][i];<br /> used[start]=true;<br /> shst[start]=shst[u]=0;<br /> //////已經有兩個點是“訪問過的了”,還要找n-2個點<br /> for(i=1;i<=n-2;i++)<br /> {<br /> kk=INF;<br /> for(j=1;j<=n;j++)<br /> {<br /> if(!used[j]&&shst[j]<kk)<br /> kk=shst[j],k=j;<br /> }<br /> used[k]=true;<br /> for(j=1;j<=n;j++)<br /> {<br /> if(!used[j]&&shst[j]>map[k][j])<br /> shst[j]=map[k][j];<br /> }<br /> }</p><p> double total=0;<br /> for(i=1;i<=n;i++)<br /> {<br /> total+=sqrt((double)shst[i]);<br /> }<br /> return total;<br />}<br />int main()<br />{<br /> // freopen("1.in","r",stdin);<br /> int T;<br /> double ans;<br /> cin>>T;<br /> while(T--)<br /> {<br /> scanf("%d",&n);<br /> input();<br /> double gyc=20000000;<br /> for(int i=1;i<=n;i++)<br /> {<br /> ans=solve(i);<br /> if(gyc>ans)<br /> gyc=ans;<br /> }<br /> printf("%.2lf/n",gyc);<br /> }<br /> return 1;<br />}<br /> :
主要是用了prim