zoukankan      html  css  js  c++  java
  • zju 1082 Stockbroker Grapevine

      这道题也是一道最短路径的题目。用的是Floyd算法。下面简述一下自己做这道题的过程。
      首先,要对Floyd算法理解清楚。Floyd算法可以求出的是任意两点之间的最短路径,注意这里是任意,所以可用一个邻接矩阵来表示各点到各点的最短路径。它的基本思想是在Vi到Vj的所有路径中找出一条长度最小的。那么如何有效的找出这一条最短的呢??<Vi,Vj>代表从Vi直接到Vj,那么<Vi,Vj>要么是一条弧的值,要么是一个无穷大的值(即这两点之间没有直接连接的弧)。我们依次在<Vi,Vj>之间插入V1到Vn,首先从V1开始,那么从Vi到Vj的最短路径可能要经过V1,所以此时比较<Vi,Vj>与<Vi,V1,Vj>的值,既是中间节点号不大于1的最短路径。然后插入V2,<Vi...V2...Vj>为中间节点号不大于2的最短路径,依次重复下去,最后那个最小的即为从Vi到VJ的最短路径。(这个思想很重要,将人的思想转化为计算机能理解的思想)
      首先,要弄清楚一个概念,消息是可以由一个股票经纪人同时传个多个股票经纪人的。此外如果我首先将信息传给Vi的话,那么信息传到全部股票经纪人的最短时间是什么呢?是Vi传到所有经纪人花费时间的最大值。(这一点很重要的,就像木桶理论的短板一样)然后,我们通过一个循环获得首先传到Vi(i=1 to n)最后花费最大值中间最小的一个时间值,那么这个时间值就是题目要求的最短时间。 如果有什么问题,欢迎讨论。

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 int main(int argc, char* argv[])
     6 {
     7     int nstockbrokers;//股票经济人的数量 
     8     int ncontacts;//
     9     int d[101][101];//至多有100个股票经纪人
    10     int v, w;
    11     while (cin >> nstockbrokers && nstockbrokers != 0)
    12     {
    13         for (int i = 0; i <= nstockbrokers; ++i)//初始化为一个最大值,即路径长度不可能大于的值 
    14             fill(&d[i][0], &d[i][nstockbrokers + 1], 2000);
    15 
    16         for (int i = 0; i <= nstockbrokers; ++i)//对角线上的值都为0 
    17             d[i][i] = 0;
    18 
    19         for (int i = 1; i <= nstockbrokers; ++i)
    20         {
    21             cin >> ncontacts;
    22             for (int j = 1; j <= ncontacts; ++j)//初步初始化临街矩阵 
    23             {
    24                 cin >> v >> w;
    25                 d[i][v] = w;
    26             }
    27         }
    28 
    29         for (int k = 1; k <= nstockbrokers; ++k)
    30             for (int i = 1; i <= nstockbrokers; ++i)
    31                 for (int j = 1; j <= nstockbrokers; ++j)
    32                     d[i][j] = min(d[i][k] + d[k][j], d[i][j]);//从i经k到j的最短路径 
    33 
    34 
    35         int mt = 2000;
    36         int person  = 0;
    37         for (int i = 1; i <= nstockbrokers; ++i)//用法很简练,在求最大值的同时求出最小值 
    38         {
    39             int tmp = *max_element(&d[i][1], &d[i][nstockbrokers + 1]);
    40             if (mt > tmp)
    41             {
    42                 mt = tmp;
    43                 person = i;
    44             }
    45         }
    46 
    47         if (mt == 2000) cout << "disjoint\n";
    48         else cout << person << " " <<mt << endl;
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    leetcode 122. Best Time to Buy and Sell Stock II
    leetcode 121. Best Time to Buy and Sell Stock
    python 集合(set)和字典(dictionary)的用法解析
    leetcode 53. Maximum Subarray
    leetcode 202. Happy Number
    leetcode 136.Single Number
    leetcode 703. Kth Largest Element in a Stream & c++ priority_queue & minHeap/maxHeap
    [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
    正则表达式
    十种排序算法
  • 原文地址:https://www.cnblogs.com/wangaohui/p/2775442.html
Copyright © 2011-2022 走看看