您的位置:首页 > 其它

ZOJ 1203 Swordfish(最小生成树Prim)

2013-12-02 17:03 295 查看
复习。

借图= =

1 #include <iostream>
2 #include <cmath>
3 #include <cstring>
4 #include <iomanip>
5 using namespace std;
6
7 const double maxd = 1000001;
8 const int N = 105;
9
double x
, y
;
double map1

, dis
;
int vis
;

double cal(int i, int j)
{
double ret = (y[i] - y[j]) * (y[i] - y[j]) + (x[i] - x[j]) * (x[i] - x[j]);
return sqrt(ret);
}

void input(int n)
{
for(int i=1; i<=n; i++)
cin >> x[i] >> y[i];
for(int i=1; i<=n; i++)
{
map1[i][i] = maxd;
for(int j=i+1; j<=n; j++)
map1[i][j] = map1[j][i] = cal(i,j);
}
}

/*
*代码思路:已一个点为起点,找n-1次,每次添加一个点进入结果集
*dis[i]维护结果集与i点的最短距离
*vis[i]代表点i是否已加入结果集
*
*/
double prim(int n)
{
double ret = 0;
int cur = 1;
for(int i=1; i<=n; i++) dis[i] = maxd;
memset(vis, 0, sizeof(vis));
dis[cur] = 0; vis[cur] = 1;
//找n-1轮
for(int i=1; i<n; i++)
{
//枚举上一次加入的点与各个点的距离,更新最小距离dis[i]
for(int j=1; j<=n; j++)
{
if(vis[j]==0 && dis[j]>map1[cur][j])
dis[j] = map1[cur][j];
}
//选出最短的边,把该边连接的点加入结果集
double mind = maxd;
for(int j=1; j<=n; j++)
{
if(vis[j]==0 && dis[j]<mind)
{
mind = dis[j];
cur = j;
}
}
vis[cur] = 1;
ret += mind;
//cout << i << ": " << mind << endl;
}
return ret;
}

int main()
{
int Case = 1, n;
while(cin >> n)
{
if(n==0) break;
input(n);
double ans = prim(n);

if(Case>1) cout << endl;
cout << "Case #" << Case++ << ":" << endl;
cout << "The minimal distance is: ";
cout << setiosflags(ios::fixed) << setprecision(2) << ans << endl;
}
return 0;
}View Code 注意算法思想与代码思路。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: