MST是一个非常非常经典的问题了,ZOJ-1203则是一题MST的裸题,题目的意思就是给定n个坐标,连起n个点最短是多长。
我用的是prim算法,创建图什么的这个大家都懂。
(好久没写过题解了,不知道说些什么好~哎。)
/*********************************************************** > OS : Linux 3.11.10-301.fc20.x86_64 Fedora20 > Author : yaolong > Mail : [email protected] > Time : 2014年07月27日 星期日 13时23分30秒 **********************************************************/ #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<cmath> using namespace std; #define INF 1<<30 class Point{ public: Point(){} double x,y; double dist(Point &pt){ return sqrt((x-pt.x)*(x-pt.x)+(y-pt.y)*(y-pt.y)); } }; Point v[105]; double mp[105][105]; double low[105]; bool used[105]; double prim(int n){ double result=0; double min; int cnt=n-1; int pos,i; memset(used,0,sizeof(used)); //原始点 used[0]=1; for(i=0;i<n;i++){ low[i]=mp[0][i]; } while(cnt--){ min=INF; for(i=0;i<n;i++){ if(!used[i]&&low[i]<min){ pos=i; min=low[i]; } } result+=min; used[pos]=1; for(i=0;i<n;i++){ if(low[i]>mp[pos][i]){ low[i]=mp[pos][i]; } } } return result; } int main(){ int n,i,j; double x,y; int cas=1; bool flag=0; while(scanf("%d",&n),n){ if(flag){ puts(""); }else{ flag=1; } for(i=0;i<n;i++){ scanf("%lf%lf",&v[i].x,&v[i].y); } for(i=0;i<n-1;i++){ for(j=i+1;j<n;j++){ mp[i][j]=mp[j][i]=v[i].dist(v[j]); } } printf("Case #%d:\n",cas); cas++; printf("The minimal distance is: %.2lf\n",prim(n)); } return 0; }
zoj-1203(Prim算法),布布扣,bubuko.com
时间: 2024-10-05 13:42:23