zoukankan      html  css  js  c++  java
  • 路由选择

    【题目描述】

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

    第一最短路径定义为:给定一个不含负回路的网络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;
    }
  • 相关阅读:
    HDU 3374 String Problem(最小(大)表示 + KMP)
    HDU 1253 胜利大逃亡
    #include <cctype>
    HDU 4162 Shape Number(最小表示法)
    USACO section1.3 Mixing Milk 混合牛奶
    HDU 1572 下沙小面的(2)
    HDU 1969 Pie
    USACO section1.2 Milking Cows 挤牛奶(区间覆盖)
    HDU 2492 Ping pong (树状数组)
    筛选法打表:求某个数的素因子之和
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5752664.html
Copyright © 2011-2022 走看看