#include
<
iostream
>
using namespace std;
#define maxVertexNumber 100
#define Infinite 9999
unsigned int VertexNumber;
struct VertexType
{
unsigned int Distance;
unsigned int Father;
bool BelongToFirstSet;
};
class VertexSetType
{
public :
VertexSetType();
~ VertexSetType(){};
unsigned int SelectMinimumDistance();
void UnionToFirstSet(unsigned int U);
void UpdateDistance(unsigned int U);
void List(unsigned int U);
void List();
private :
// unsigned int VertexNumber;
VertexType Vertex[maxVertexNumber];
int Cost[maxVertexNumber][maxVertexNumber];
unsigned int SourceVertex;
};
VertexSetType::VertexSetType()
{
cout << " 请输入代价矩阵的行列数( " << " 小于 " << maxVertexNumber << " ): " ;
cin >> VertexNumber;
cout << " 请输入代价矩阵( " << VertexNumber << " X " << VertexNumber << " ): " ;
cout << endl;
for (unsigned int i = 0 ;i < VertexNumber;i ++ )
{
for (unsigned int j = 0 ;j < VertexNumber;j ++ )
cin >> Cost[i][j];
}
for (unsigned int i = 0 ;i < VertexNumber;i ++ )
for (unsigned int j = 0 ;j < VertexNumber;j ++ )
if (Cost[i][j] == 0 )
Cost[i][j] = Infinite;
cout << " 请输入源点号: " ;
cin >> SourceVertex;
for (unsigned int i = 0 ;i < VertexNumber;i ++ )
{
Vertex[i].BelongToFirstSet = false ;
Vertex[i].Distance = Cost[SourceVertex][i];
Vertex[i].Father = SourceVertex;
}
Vertex[SourceVertex].BelongToFirstSet = true ;
Vertex[SourceVertex].Distance = 0 ;
}
unsigned int VertexSetType::SelectMinimumDistance()
{
unsigned int Minimum,i,j;
j = 0 ;
Minimum = Infinite;
// while((Vertex[j].BelongToFirstSet) && (j<VertexNumber))
// j += 1;
for (i = 0 ;i < VertexNumber;i ++ )
if (( ! Vertex[i].BelongToFirstSet) && (Vertex[i].Distance < Minimum))
{
Minimum = Vertex[i].Distance;
j = i;
}
return j;
}
void VertexSetType::UnionToFirstSet(unsigned int U)
{
Vertex[U].BelongToFirstSet = true ;
}
void VertexSetType::UpdateDistance(unsigned int U)
{
unsigned int W;
for (W = 0 ; W < VertexNumber; W ++ )
if ( ( ! Vertex[W].BelongToFirstSet) && (Vertex[W].Distance > Vertex[U].Distance + Cost[U][W]) )
{
Vertex[W].Distance = Vertex[U].Distance + Cost[U][W];
Vertex[W].Father = U;
}
}
void VertexSetType::List(unsigned int U)
{
if ( U == SourceVertex )
cout << " ( " << U << " ) " ;
else
{
List( Vertex[U].Father );
cout << " -- " << Vertex[U].Distance - Vertex[ Vertex[U].Father ].Distance << " -- " << " ( " << U << " ) " ;
}
/*
for(i=0;i<VertexNumber;i++)
if( i != SourceVertex )
cout << SourceVertex << "-->" << i << "===" << Vertex[i].Distance << endl; */
}
void VertexSetType::List()
{
for (unsigned int i = 0 ;i < VertexNumber;i ++ )
if ( i != SourceVertex )
{
List ( i );
cout << endl;
}
}
int main()
{
VertexSetType VertexSet;
unsigned int U;
unsigned int Count = 2 ;
while ( Count < VertexNumber )
{
U = VertexSet.SelectMinimumDistance();
VertexSet.UnionToFirstSet ( U );
Count ++ ;
VertexSet.UpdateDistance ( U );
}
VertexSet.List();
return 0 ;
}
using namespace std;
#define maxVertexNumber 100
#define Infinite 9999
unsigned int VertexNumber;
struct VertexType
{
unsigned int Distance;
unsigned int Father;
bool BelongToFirstSet;
};
class VertexSetType
{
public :
VertexSetType();
~ VertexSetType(){};
unsigned int SelectMinimumDistance();
void UnionToFirstSet(unsigned int U);
void UpdateDistance(unsigned int U);
void List(unsigned int U);
void List();
private :
// unsigned int VertexNumber;
VertexType Vertex[maxVertexNumber];
int Cost[maxVertexNumber][maxVertexNumber];
unsigned int SourceVertex;
};
VertexSetType::VertexSetType()
{
cout << " 请输入代价矩阵的行列数( " << " 小于 " << maxVertexNumber << " ): " ;
cin >> VertexNumber;
cout << " 请输入代价矩阵( " << VertexNumber << " X " << VertexNumber << " ): " ;
cout << endl;
for (unsigned int i = 0 ;i < VertexNumber;i ++ )
{
for (unsigned int j = 0 ;j < VertexNumber;j ++ )
cin >> Cost[i][j];
}
for (unsigned int i = 0 ;i < VertexNumber;i ++ )
for (unsigned int j = 0 ;j < VertexNumber;j ++ )
if (Cost[i][j] == 0 )
Cost[i][j] = Infinite;
cout << " 请输入源点号: " ;
cin >> SourceVertex;
for (unsigned int i = 0 ;i < VertexNumber;i ++ )
{
Vertex[i].BelongToFirstSet = false ;
Vertex[i].Distance = Cost[SourceVertex][i];
Vertex[i].Father = SourceVertex;
}
Vertex[SourceVertex].BelongToFirstSet = true ;
Vertex[SourceVertex].Distance = 0 ;
}
unsigned int VertexSetType::SelectMinimumDistance()
{
unsigned int Minimum,i,j;
j = 0 ;
Minimum = Infinite;
// while((Vertex[j].BelongToFirstSet) && (j<VertexNumber))
// j += 1;
for (i = 0 ;i < VertexNumber;i ++ )
if (( ! Vertex[i].BelongToFirstSet) && (Vertex[i].Distance < Minimum))
{
Minimum = Vertex[i].Distance;
j = i;
}
return j;
}
void VertexSetType::UnionToFirstSet(unsigned int U)
{
Vertex[U].BelongToFirstSet = true ;
}
void VertexSetType::UpdateDistance(unsigned int U)
{
unsigned int W;
for (W = 0 ; W < VertexNumber; W ++ )
if ( ( ! Vertex[W].BelongToFirstSet) && (Vertex[W].Distance > Vertex[U].Distance + Cost[U][W]) )
{
Vertex[W].Distance = Vertex[U].Distance + Cost[U][W];
Vertex[W].Father = U;
}
}
void VertexSetType::List(unsigned int U)
{
if ( U == SourceVertex )
cout << " ( " << U << " ) " ;
else
{
List( Vertex[U].Father );
cout << " -- " << Vertex[U].Distance - Vertex[ Vertex[U].Father ].Distance << " -- " << " ( " << U << " ) " ;
}
/*
for(i=0;i<VertexNumber;i++)
if( i != SourceVertex )
cout << SourceVertex << "-->" << i << "===" << Vertex[i].Distance << endl; */
}
void VertexSetType::List()
{
for (unsigned int i = 0 ;i < VertexNumber;i ++ )
if ( i != SourceVertex )
{
List ( i );
cout << endl;
}
}
int main()
{
VertexSetType VertexSet;
unsigned int U;
unsigned int Count = 2 ;
while ( Count < VertexNumber )
{
U = VertexSet.SelectMinimumDistance();
VertexSet.UnionToFirstSet ( U );
Count ++ ;
VertexSet.UpdateDistance ( U );
}
VertexSet.List();
return 0 ;
}