MPI Maelstrom POJ 1502

来源:互联网 发布:vb.net winhttp 编辑:程序博客网 时间:2024/06/05 16:35

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

读个题能把我读疯,愣是读了40分钟才明白题意。

大致题意:共有n个(1<=n<=100)中央处理器,将其由1到n编号,输入每个处理器分别传递信息到其他处理器所需的时间()(自己传给自己不需要时间,两处理器互传信息时间相同),当输入的为字符x时表示这两处理器间无法直接传递信息,一个处理器收到信息时可同时将信息发给所有与该处理器相连的处理器。问从第一个处理器发送信息,最短需要多长时间传遍所有处理器。

我的算法虽能AC但肯定效率不高,但不需要额外知识,应该相对好理解,仅做参考。
思路:用布尔型二维数组t的第一维度下标记录时间,第二维下标对应的处理器,数组元素记录处理器状态(true表示该处理器已收到信息,反之false),即t[10][5]=true表示第十秒时编号为五的处理器已收到信息。
用整形二维数组a记录两处理器间传递所需的时间。
然后利用递归走遍所有情况,将结果记录到t数组中,最后寻找最短在哪个时间所有处理器都收到信息了即可。
具体实现方法见代码及注释

代码:c++

#include <cstdio>#include <iostream>using namespace std;int a[110][110];//记录两处理器传递信息所需的时间bool t[10001][101];//记录每一时刻每个处理器的状态bool check(int time, int n)//检查time时刻是否所有处理器都已收到信息{    int i;    for(i=1;i<=n;i++)    {        if(t[time][i]==false)            return false;    }    return true;}void broadcast(int i, int n, int time)//递归模拟在time时刻信息传递到第i个处理器的情况{    int j,k;    for(j=time;j<=10000;j++)//至此time时刻往后所有时刻第i个处理器肯定已收到信息    {        if(t[j][i])//保证不超时的关键,当此时第i个处理器若已收到信息        {          //则没必要在继续更改之后时间第i个处理器的状态            break;        }        else        {            t[j][i] = true;        }    }    for(j=1;j<=n;j++)    {        if(!t[time][j]&&a[i][j]!=-1&&j!=i)//当第j个处理器在time时刻仍未收到信息且信息可由第i个处理器传到第j个处理器时        {            broadcast(j, n, time+a[i][j]);        }    }}int main(){    int n,b;    int i,j,k;    cin >> n;    for(i=2;i<=n;i++)    {        for(j=1;j<i;j++)        {            if(scanf("%d", &b)!=1)            {                a[i][j] = a[j][i] = -1;//表示第i、j个处理器无法直接传递信息                getchar();                getchar();            }            else            {                a[i][j] = a[j][i] = b;            }        }    }    broadcast(1, n, 0);    for(i=0;i<=10000;i++)    {        if(check(i,n))        {            printf("%d\n", i);            break;        }    }    return 0;}
0 0