• 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 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    springboot之手动控制事务
    Java的几种常见排序算法
    Java之协程(quasar)
    中文字符和中文标点符号的正则表达式
    【转】SignalR与ActiveMQ结合构建实时通信
    【转】根据Quartz-Cron表达式获取最近几次执行时间
    【转】IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
    【转】C# 中Linq查询所有上级节点或所有下级节点
    【转】FluentAPI详细用法
    【转】SQL数据库日志文件收缩
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4237598.html
Copyright © 2020-2023  润新知