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;
}
posted @ 2008-11-10 22:35  ..  阅读(330)  评论(0编辑  收藏  举报