路由选择

【题目描述】

任意两节点之间通信提供三条路径供其选择,即最短路径、第二最短路径和第三最短路径。

第一最短路径定义为:给定一个不含负回路的网络D={V、A、W},其中V={v1、v2、······、vn},A为边的集合,W为权的集合,设P1是D中最短路。称P1为D中最短路径,如果D中有一条路P2满足以下条件:

(1)P2≠P1;

(2)D中不存在异于P1的路P,使得:W(P1) ≤ W(P) < W(P2);

则称P2为D的第二最短路径。

第三最短路径的定义为:设P2是D中第二最短路径,如果D中有一条路P3满足以下条件:

(1)P3≠P2且P3≠P1;

(2)D中不存在异于P1、P2的路P,使得:W(P2) ≤ W(P) < W(P3);

则称P3为D中第三最短路径。

现给定一有N个节点的网络,N ≤ 30,求给定两点间的第一、第二和第三最短路径。

【输入描述】

输入:n  S  T  Max

        M11  M12  ······  M1n

        M21  M22  ······  M2n

        ······

        Mn1  Mn2  ······  Mnn

其中,n为节点数,S为起点,T为终点,Max为一代表无穷大的整数,Mij描述i到j的距离,若Mij=Max,则表示从i到j无直接通路,Mii=0。

【输出描述】

输出:三条路径(从小到大输出),每条路径占一行,形式为:路径长度 始点 ······ 终点(中间用一个空格分隔)。

【样例输入】

5 1 5 10000

0 1 3 10000 7

10000 0 1 10000 10000       

10000 10000 0 1 4

10000 10000 10000 0 1

10000 1 10000 10000 0

【样例输出】

4 1 2 3 4 5

5 1 3 4 5

6 1 2 3 5

源代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,Start,End,Max,Num(0),Map[31][31],Vis[31],Number[31];
struct Node
{
    int S,Sum,Step[31];
}i[300001];
void Init(int Sum,int Length)
{
    i[++Num].Sum=Sum-1;
    i[Num].S=Length;
    for (int a=0;a<Sum;a++)
      i[Num].Step[a]=Number[a];
}
void DFS(int T,int Sum,int Length)
{
    if (T==End)
    {
        Init(Sum,Length);
        return;
    }
    Vis[T]=true;
    for (int a=1;a<=n;a++)
      if (!Vis[a]&&Map[T][a])
      {
          Number[Sum]=a;
          Vis[a]=true;
          DFS(a,Sum+1,Length+Map[T][a]);
          Vis[a]=false;
      }
}
bool Rule(Node t1,Node t2)
{
    return t1.S<t2.S;
}
int main()
{
    scanf("%d%d%d%d",&n,&Start,&End,&Max);
    for (int a=1;a<=n;a++)
      for (int b=1;b<=n;b++)
      {
          scanf("%d",&Map[a][b]);
          if (Map[a][b]==Max)
            Map[a][b]=0;
      }
    DFS(Start,0,0);
    sort(i,i+Num+1,Rule);
    printf("%d %d ",i[1].S,Start);
    for (int a=0;a<=i[1].Sum;a++)
      printf("%d ",i[1].Step[a]);
    printf("
");
    printf("%d %d ",i[2].S,Start);
    for (int a=0;a<=i[2].Sum;a++)
      printf("%d ",i[2].Step[a]);
    printf("
");
    printf("%d %d ",i[3].S,Start);
    for (int a=0;a<=i[3].Sum;a++)
      printf("%d ",i[3].Step[a]);
    return 0;
}
原文地址:https://www.cnblogs.com/Ackermann/p/5752664.html