标签:style mat algo 有一个 names amp 旗舰店 ble 一个
第一次做prim的最小生成树的题目,据说相比kruskal更适应稠密图,用kruskal会mle?(待测)
关于题目:所有的旗舰店相当于已经连通,其他点没有连通,然而有一个小问题:n个点中有k个旗舰店,应该连n-k条路,但是循环结束标志为i=n-k-1确实wa7,只有将循环结束标志设置为所有的lowcost都为0时才可以,一直没想通两者的区别?
#include<cstdio> #include<algorithm> #include<math.h> #define maxn 6666+50 #define inf 1e12 using namespace std; typedef struct Point { double x; double y; int type; }; int n; Point poi[maxn]; double lowcost[maxn]; int liansuo=0; double dist(int i,int j) { double disx=fabs(poi[i].x-poi[j].x); double disy=fabs(poi[i].y-poi[j].y); return sqrt(disx*disx+disy*disy); } double prim(void) { int i,j; double res=0; for(i=1;i<=n;i++) { lowcost[i]=inf; } for(i=1;i<=n;i++) { if(poi[i].type==1) { lowcost[i]=0; } else if(poi[i].type==0) { for(j=1;j<=n;j++) { if(poi[j].type==1) { double temp=dist(i,j); if(temp<lowcost[i]) { lowcost[i]=temp; } } } } } for(i=1;i<=n;i++) { double tt=inf; int ttind=-1; for(j=1;j<=n;j++) { if(lowcost[j]!=0) { if(lowcost[j]<tt) { tt=lowcost[j]; ttind=j; } } } if(ttind==-1) { return res; } res=res+tt; lowcost[ttind]=0; for(j=1;j<=n;j++) { if(lowcost[j]!=0) { double tempdis=dist(j,ttind); lowcost[j]=min(tempdis,lowcost[j]); } } } return res; } int main() { int i,j; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%lf%lf%d",&poi[i].x,&poi[i].y,&poi[i].type); if(poi[i].type==1) { liansuo++; } } double ans=prim(); printf("%.2lf\n",ans); return 0; }
标签:style mat algo 有一个 names amp 旗舰店 ble 一个
原文地址:http://www.cnblogs.com/lionelyu/p/7719829.html