POJ 2253 Prim算法及测试数据

prim算法求最小生成树中的最大边

测试数据:

2
0 0
3 4

3
17 4
19 4
18 5
8
1 1
4 0
1 2
2 2
3 2
4 2
3 0
5 1
3
9 10
10 10
100 10
6
5 5
100 100
4 4
3 3
2 2
1 1
5
1 2
2 1
3 2
4 1
5 2
3
999 999
1 1
3 3
0

结果

Scenario #1
Frog Distance
= 5.000

Scenario #
2
Frog Distance
= 1.414

Scenario #
3
Frog Distance
= 1.414

Scenario #
4
Frog Distance
= 1.000

Scenario #
5
Frog Distance
= 134.350

Scenario #
6
Frog Distance
= 1.414

Scenario #
7
Frog Distance
= 1408.557
#include <iostream>
#include
<math.h>
#define MAX 201

#define sq(a) ((a)*(a))
float dis[MAX][MAX];
typedef
struct node{
int x,y;

}Node;
long int INF =99999999;
bool inTree[MAX];
Node nodes[MAX];
void ptable(int count){
int i,j;
for(i=0;i<count;i++){
for(j=0;j<count;j++)
printf(
"(%d,%d)%10f",i,j,dis[i][j]);
printf(
"\n");
}
}
bool allInTree(int count){

for(int i=0;i<count;i++)
if(!inTree[i])return false;
return true;
}
int prim(int v,int n){
int i,j,ti,tj;
float mindis,maxdis = -1;
memset(inTree,
false,sizeof(inTree));
inTree[
0] = true;
while(!allInTree(n)){
mindis
=INF;

//找到最小权值
for(i=0;i<n;i++)
{
if(inTree[i]){
for(j=0;j<n;j++)
if(i!=j&&!inTree[j]&&dis[i][j]<=mindis){
mindis
=dis[i][j];
ti
= i;
tj
= j;
}
}
}
if(mindis>maxdis)maxdis=mindis;
//找到终点
if(ti==1||tj==1){

return maxdis;
}
//printf("%d %d\nIntree:",ti,tj);
//inTree[ti]=true;
inTree[tj]=true;

//for(int k=0;k<n;k++)
//if(inTree[k])printf("%d ",k);
//printf("\n");
//ptable(n);
}




return maxdis;
}
int main(int argc, char* argv[])
{
//freopen("i://t.txt","r",stdin);
//freopen("i://out.txt","w",stdout);
int count,i,j,c = 1;
while(scanf("%d",&count)&&count){



for(i=0;i<count;i++)
{
scanf(
"%d%d",&nodes[i].x,&nodes[i].y);
for(j=0;j<i;j++){
dis[i][j]
=sq(nodes[i].x-nodes[j].x)+sq(nodes[i].y-nodes[j].y);
dis[j][i]
=dis[i][j];
}
dis[i][i]
= 0;
}
printf(
"Scenario #%d\n",c++);
printf(
"Frog Distance = %.3lf\n\n",sqrt((float)prim(0,count)));




}
return 0;
}
原文地址:https://www.cnblogs.com/yangyh/p/2040872.html