您的位置:首页 > 其它

poj 1502 MPI Maelstrom

2015-01-20 22:22 591 查看
题目链接:

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

题目大意:

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

解题思路:

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

#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

#define maxn 110
#define INF 0x3f3f3f3f

int map[maxn][maxn], dist[maxn], n;

void init ();
void dijkstra ();

int main ()
{
while (scanf ("%d", &n) != EOF)
{
char s[20];
init ();
for (int i=1; i<=n; i++)
for (int j=1; j<i; j++)
{
scanf ("%s", s);
if (s[0] <= '9' && s[0] >= '0')
{
map[i][j] = 0;
for (int k=0; s[k]; k++)
map[i][j] = map[i][j] * 10 + s[k] - '0';
map[j][i] = map[i][j];//路径是双向的
}
}
dijkstra ();
int mini = 0;
for (int i=2; i<=n; i++)
mini = max(mini, dist[i]);
printf ("%d\n", mini);
}
return 0;
}

void init ()
{
int i, j;
for (i=0; i<maxn; i++)
for (j=0; j<maxn; j++)
if (i == j)
map[i][j] = 0;//自身到达自身所用花费为零
else
map[i][j] = INF;
}

void dijkstra ()
{
bool vis[maxn];
memset (vis, false, sizeof(vis));
for (int i=1; i<=n; i++)
dist[i] = map[1][i];

vis[1] = true;

for (int i=1; i<n; i++)
{
int temp = INF, index;
for (int j=2; j<=n; j++)
{
if (!vis[j] && temp > dist[j])
{
index = j;
temp = dist[j];
}
}

vis[index] = true;

for (int j=2; j<=n; j++)
if (!vis[j] )
dist[j] = min(dist[j] , dist[index] + map[index][j]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: