最短路径条数

给定如图所示的无向连通图,假定图中所有边的权值都为1,显然,从源点A到终点T的最短路径有多条,求不同的最短路径的数目。以下的内容和思想来自小象学院邹博的课程。



//最短路径条数
const int N=16;

int Calc(int G[N][N])
{
    int step[N];    //每个结点第几步可以到达
    int stepNumber[N];    //到每个节点有几种走法
    memset(step, 0, sizeof(int)*N);
    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++) {      //0是起点,不遍历
            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][5]=G[4][0]=1;
    G[5][1]=G[5][4]=G[5][6]=G[5][9]=1;
    G[6][2]=G[6][5]=G[6][7]=G[6][10]=1;
    G[7][3]=G[7][6]=1;
    G[8][12]=G[8][9]=1;
    G[9][8]=G[9][13]=G[9][10]=1;
    G[10][9]=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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值