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
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
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 ;
}
#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 ;
}