Dijkstra算法-用于求单源最短路径

Dijkstra算法




#include <iostream>

using namespace std;

#define MaxLine 9999

 struct Node{

    int node;

    int value;

    Node*next;

};

#define InISize 20

#define AppSize 50

typedef struct Stack{

    int Capacity;

    Node*base;

    Node*top;

}Stack;

typedef struct queue{

    Node *rear;

    Node *front;

    int size;

}Queue;

void IniStack(Stack *s)

{

    s->base=(Node*)malloc(InISize*sizeof(Node));

    if(!s->base)

        return ;

    s->top=s->base;

    s->Capacity=InISize;

}

int StackSize(Stack *s)

{

    return (int)(s->top-s->base);

}

int EmptyStack(Stack *s)

{

    if(s->base==s->top)

    {

        return 1;

    }

    else

        return 2;

}

void ClearStack(Stack *s)

{

    s->top=s->base;

}

void Push(Stack *s,Node d)

{

    

    if(s->top-s->base>=s->Capacity)

    {

        s->base=(Node *)realloc(s->base,AppSize*sizeof(Node));

        if(!s->base)

            return ;

        s->top=s->base+s->Capacity;

        s->Capacity=AppSize+InISize;

    }

    *(s->top)=d;

    s->top++;

}

bool searchIn(const int &j,Stack s)

{

    bool res=false;

    

    while(s.base!=s.top)

    {

        if(s.base->node==j)

        {

            res=true;

            break;

        }

        s.base++;

    }

    return res;

}

void DijkstraAlgorithm(Stack *s)

{

    int n;

    cout<<"the amount of node:";

    cin>>n;

    int **a=new int * [n+1];

    for(int i=0;i<=n;i++)

        a[i]=new int [n+1];

    cout<<"specific data:(as -1 is on behalf of ending)"<<endl;

    for(int i=1;i<n+1;i++)

    {

        for(int j=1;j<n+1;j++)

            a[i][j]=MaxLine;

    }

    int i,j,k;

    while(cin>>i>>j>>k)

    {

        if(i>n||j>n)

            break;

        if((i>0&&i<=n)&&(j>0&&j<=n))

        {

            a[i][j]=k;

        }

        if(i==-1||j==-1)

            break;

    }

    int start;

    cout<<"the starting node:";

    cin>>start;

    int temp=start;

    int value=MaxLine;

    Node *l=(Node*)malloc(sizeof(Node));

    l->node=start;

    l->value=value;

    Push(s, *l);

    for(int j=1;j<=n;j++)

    {

       if(a[temp][j]!=MaxLine-1)

        if(value>a[start][j])

        {

            value=a[start][j];

            temp=j;

        }

       

        //

    }

    Node *lose=(Node*)malloc(sizeof(Node));

    lose->node=temp;

    lose->value=value;

    Push(s, *lose);

    for(int i=1;i<=n;i++){

        if(a[temp][i]==MaxLine)

            cout<<"not  ";

        else

            cout<<" "<<a[temp][i];

        

    }

    cout<<endl;

    while(StackSize(s)!=n){

        value=MaxLine;

    for(int i=1;i<=n;i++)

    {

        for(int j=1;j<=n;j++)

        {

            if(i==temp)

            {

                if(a[temp][j]!=MaxLine&&a[start][i]!=MaxLine)

                {

                    if(a[temp][j]+a[start][i]<a[start][j])

                    {

                        a[temp][j]=a[temp][j]+a[start][i];

                    }

                    else

                    {

                        a[temp][j]=a[start][j];

                    }

                }

                if(a[temp][j]==MaxLine&&a[start][i]!=MaxLine)

                {

                    a[temp][j]=a[start][j];

                }

            }

        }

    }

        for(int i=1;i<=n;i++){

            if(a[temp][i]==MaxLine)

                cout<<"not";

            else

            cout<<" "<<a[temp][i];

            

        }

        cout<<endl;

    start=temp;

    for(int j=1;j<=n;j++)

    {

        if(a[start][j]!=MaxLine&&!searchIn(j, *s))

            if(value>a[start][j])

            {

                value=a[start][j];

                temp=j;

            }

       

        //

    }

    Node *lose=(Node*)malloc(sizeof(Node));

    lose->node=temp;

    lose->value=value;

    Push(s, *lose);

    

    }

}

void showLink(Stack *s)

{

    Node *h=s->base;

    Node *p=s->base;

    while(h!=s->top)

    {

        cout<<" "<<h->node;

        h++;

    }

    cout<<endl;

    while(p!=s->top)

    {

        cout<<" "<<p->value;

        p++;

    }

    cout<<endl;

}



int main(int argc, const char * argv[]) {

    // insert code here...

    std::cout << "Hello, World!\n";

    Stack S;

    IniStack(&S);

    DijkstraAlgorithm(&S);

    cout<<StackSize(&S)<<endl;

    showLink(&S);

    return 0;

}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Dijkstra算法是一种用于单源最短路径的经典算法。它以一个源顶点为起始点,通过不断扩展最短路径树来寻找到其他所有顶点的最短路径。下面是Dijkstra算法的思路和步骤。 首先,我们需要定义一个顶点集合,用于存放已经得最短路径的顶点。算法开始时,所有顶点都被标记为未被访问,并且它们的最短路径长度都初始化为无穷大。 然后,我们从起始顶点开始,将其最短路径长度置为0,并将其加入到已得最短路径的集合中。此外,我们还需要更新起始顶点的邻居顶点的最短路径长度。 接下来,我们进入循环,不断选择最短路径长度最小的顶点,将其加入到已得最短路径的集合中。然后,更新该顶点的邻居顶点的最短路径长度。具体的更新方式是,如果通过当前选中的顶点访问邻居顶点的路径长度比已知的最短路径长度小,那么更新邻居顶点的最短路径长度。 最后,当所有顶点都被加入到已得最短路径的集合中,或者存在无穷大的路径时,算法结束。此时,我们得到了从起始顶点到其他所有顶点的最短路径长度。 Dijkstra算法的时间复杂度为O(V^2),其中V为图中顶点的数量。此外,它还可以通过使用优先队列来优化,将时间复杂度降低到O((V+E)logV),其中E为图中边的数量。 总之,Dijkstra算法是一种单源最短路径的有效算法,它可以应用于各种实际问题中,如路由选择、网络通信、物流规划等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值