zoukankan      html  css  js  c++  java
  • poj 1502 MPI Maelstrom

    题目链接:

      http://poj.org/problem?id=1502

    题目大意:

      有一个信息传递系统,含有n个处理器,传递信息的方式是:刚开始编号为1的处理器拥有信息,他可以传给下一个处理器,然后这两个拥有信息的处理器可以同时向下传递给其他两个处理器,拥有信息的四个处理器再依次如此传递,直到所有处理器都接受到信息的最短时间是多少?

    解题思路:

      把传递路径画出来,看出可以转化成求从1到其他位置的最短路径中的最长路径,刚看到题目感觉没什么思路,但是建立出来模型以后用dijkstra就好啦!

     1 #include <vector>
     2 #include <queue>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <cstdlib>
     6 #include <iostream>
     7 #include <algorithm>
     8 using namespace std;
     9 
    10 #define maxn 110
    11 #define INF 0x3f3f3f3f
    12 
    13 int map[maxn][maxn], dist[maxn], n;
    14 
    15 void init ();
    16 void dijkstra ();
    17 
    18 int main ()
    19 {
    20     while (scanf ("%d", &n) != EOF)
    21     {
    22         char s[20];
    23         init ();
    24         for (int i=1; i<=n; i++)
    25             for (int j=1; j<i; j++)
    26             {
    27                 scanf ("%s", s);
    28                 if (s[0] <= '9' && s[0] >= '0')
    29                 {
    30                     map[i][j] = 0;
    31                     for (int k=0; s[k]; k++)
    32                         map[i][j] = map[i][j] * 10 + s[k] - '0';
    33                     map[j][i] = map[i][j];//路径是双向的
    34                 }
    35             }
    36         dijkstra ();
    37         int mini = 0;
    38         for (int i=2; i<=n; i++)
    39             mini = max(mini, dist[i]);
    40         printf ("%d
    ", mini);
    41     }
    42     return 0;
    43 }
    44 
    45 void init ()
    46 {
    47     int i, j;
    48     for (i=0; i<maxn; i++)
    49         for (j=0; j<maxn; j++)
    50             if (i == j)
    51                 map[i][j] = 0;//自身到达自身所用花费为零
    52             else
    53                 map[i][j] = INF;
    54 }
    55 
    56 void dijkstra ()
    57 {
    58     bool vis[maxn];
    59     memset (vis, false, sizeof(vis));
    60     for (int i=1; i<=n; i++)
    61         dist[i] = map[1][i];
    62 
    63     vis[1] = true;
    64 
    65     for (int i=1; i<n; i++)
    66     {
    67         int temp = INF, index;
    68         for (int j=2; j<=n; j++)
    69         {
    70             if (!vis[j] && temp > dist[j])
    71             {
    72                 index = j;
    73                 temp = dist[j];
    74             }
    75         }
    76 
    77         vis[index] = true;
    78 
    79         for (int j=2; j<=n; j++)
    80             if (!vis[j] )
    81                 dist[j] = min(dist[j] , dist[index] + map[index][j]);
    82     }
    83 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    【结对开发】电梯调度 一(从电梯布局分配考虑)需求分析及设计思路。
    【结对开发】求一个整数数组的所有子数组中和的最大值。
    【测试用例选取及异常处理】 之 求一个数组中的最大整数。
    互测测评报告
    绩效考核
    冲刺5
    写个烂android一天到晚活累死,
    冲刺3
    冲刺2
    冲刺1
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4237598.html
Copyright © 2011-2022 走看看