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;
    }
  • 相关阅读:
    1046 Shortest Distance (20 分)(模拟)
    1004. Counting Leaves (30)PAT甲级真题(bfs,dfs,树的遍历,层序遍历)
    1041 Be Unique (20 分)(hash散列)
    1036 Boys vs Girls (25 分)(查找元素)
    1035 Password (20 分)(字符串处理)
    1044 Shopping in Mars (25 分)(二分查找)
    onenote使用小Tip总结^_^(不断更新中...)
    1048 Find Coins (25 分)(hash)
    三个故事
    领导者的举止
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5752664.html
Copyright © 2011-2022 走看看