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