最短路径条数问题(退化Dijkstra,BFS)

来源:互联网 发布:组策略启用网络映射 编辑:程序博客网 时间:2024/05/17 01:24

最短路径条数问题

#include <iostream>#include <queue>#include <cstring>using namespace std;const int N = 16;int Calc(const int G[N][N]){    int step[N];  //记录 每个节点从起点开始几步能走到    int stepNumber[N];  //记录 到每个节点的最短路有几种走法    memset(step, 0, sizeof(int)*N);// 置0    memset(stepNumber, 0, sizeof(int)*N);    stepNumber[0] = 1;    queue<int> q; //用来存当前搜索节点的额队列    q.push(0);  //第一个节点入队列    int from, i, s;    while(!q.empty())    {        from = q.front();        q.pop();        s = step[from] + 1; //下一个节点的步数        for(i = 1; i < N; i++)        {            if(G[from][i] == 1)            {                //i没有到来过,或者发现了更短的路,就把以前的最短步数和最短路径数目替换掉                if(step[i] == 0 || (step[i] > s))                {                    step[i] = s;                    stepNumber[i] = stepNumber[from];                    q.push(i);                }                else if(step[i] == s)                {                    stepNumber[i] += stepNumber[from];                }            }        }    }    return stepNumber[N-1];}int main() {    int G[N][N];    memset(G, 0, sizeof(int) * N *N);    //构建邻接表    G[0][1] = G[0][4] = 1;    G[1][5] = G[1][0] = G[1][2] = 1;    G[2][1] = G[2][6] = G[2][3] = 1;    G[3][2] = G[3][7] = 1;    G[4][0] = G[4][5] = 1;    G[5][1] = G[5][4] = G[5][6] = G[5][9] = 1;    G[6][5] = G[6][2] = G[6][7] = G[6][10]= 1;    G[7][6] = G[7][3] = 1;    G[8][9] = G[8][12] = 1;    G[9][5] = G[9][8]= G[9][10]= G[9][13] = 1;    G[10][6] = G[10][9]= G[10][13]= G[10][14]= G[10][11] = 1;    G[11][10] = G[11][15] = 1;    G[12][8] = G[12][13] = 1;    G[13][9] = G[13][12] = G[13][14] = 1;    G[14][10] = G[14][13] = G[14][15] = 1;    G[15][11] = G[15][14] = 1;    cout << Calc(G) << endl;    return 0;}