使用分支限界法解決單源最短路徑問題。

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;

typedef struct ArcCell{
    int weight;//保存權值 weight=1說明一開始就輸入了這條邊,=0說明這兩個點之間沒有邊 
    int min_length;//存儲最短路徑長度
}ArcCell,AdjMaxtrix[100][100];

typedef struct{
    int data;//頂點編號 
    int length;//起始頂點到data編號頂點的最短路徑 
}VerType;

typedef struct{
    VerType vexs[100];//頂點向量
    AdjMaxtrix arcs;
    int dingdian;//頂點數
    int bian;//邊的數量 
}Graph;

Graph G;
queue<int> q;

void CreateGraph()
{
    int m,n,t;
    printf("輸入頂點數和邊數:");
    scanf("%d%d",&G.dingdian,&G.bian);
    printf("輸入頂點編號:");
    for(int i=1 ; i<=G.dingdian ; i++)
    {
        scanf("%d",&G.vexs[i].data);
        G.vexs[i].length=10000;
    }

    for(int i=1;i<=G.dingdian;i++)
        for(int j=1;j<=G.dingdian;j++)
        {
            G.arcs[i][j].weight=0;//先置零 weight=1說明一開始就輸入了這條邊,=0說明這兩個點之間沒有邊 
        }
    printf("輸入所有邊的起點、終點和邊長(用空格隔開):\n");
    for(int i=1;i<=G.bian;i++)
        {
            scanf("%d%d%d",&m,&n,&t);
            G.arcs[m][n].weight=1;//weight=1說明一開始就輸入了這條邊,=0說明這兩個點之間沒有邊 
            G.arcs[m][n].min_length=t;
        }
}

int Nextweight(int v,int w)
{
    for(int i=w+1;i<=G.dingdian;i++)
        if(G.arcs[v][i].weight) 
            return i;//返回已有的邊中序號最前的 
    return 0;//未找到符合條件結點,就直接返回最初的結點;
}

void ShortestPaths(int v)
{
    int k=0;//從首個節點開始訪問,k記錄想要訪問結點的位置 
    int t;
    G.vexs[v].length=0;
    q.push(G.vexs[v].data);
    while(!q.empty())//隊列q不爲空的時候執行循環 
    {
        t=q.front();//t爲隊列中第一個元素,也就是最先要被彈出的結點,返回值是其編號,第一次執行這一步時是 G.vexs[1].data,初始結點的編號 
        k=Nextweight(t,k);//k不斷更新爲已有的邊中序號最前的  
        while(k!=0)
        {
            if(G.vexs[t].length+G.arcs[t][k].min_length<=G.vexs[k].length)//減枝操作
            {
                G.vexs[k].length=G.vexs[t].length+G.arcs[t][k].min_length;

                q.push(G.vexs[k].data);
            }
            k=Nextweight(t,k);//k不斷更新爲已有的邊中序號最前的 
        }
        q.pop();
    }
}

void Print()
{
    for(int i=2;i<=G.dingdian;i++)
        printf("頂點1到頂點%d的最短路徑長是:%d\n",G.vexs[i].data,G.vexs[i].length);
}

int main()
{
    CreateGraph();
    ShortestPaths(1);
    Print();
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章