POJ-1502 MPI Maelstrom (裸dijkstra算法)

8 篇文章 0 订阅

题目大意:

大概就是说,有n个处理器,每两个处理器之间都有两个状态,一是可直接联通,而是不可直接联通。
然后求出从第一个处理器到另外各个点的时间最长的值是多少。
这道题的输入需要注意一下,题目输入的是一个邻接矩阵的下三角,所以需要自己特殊处理一下。但是问题并不大。

算法分析:

这道题就是纯粹的裸dijkstra模板,我之前写的那篇POJ-1602其实并不是dijkstra算法,当时我没有搞明白dijstra算法的
具体实现,是自己瞎j8乱写的(虽然最后也做出来了),这次我完全理解了dijkstra算法,所以特意写了一篇博客记录一下。
这次的运气比较好,一次就A掉了 (^_^)

代码

#include <stdio.h>
#include <string.h>

#include <iostream>
#include <algorithm>

#define MAXNUM 0x7fffffff

using namespace std;

int n;
long long edge[110][110];
long long maxn[110];
bool statu[110];

int dijkstra()
{
    for (int i = 1; i <= n; i++) {
        maxn[i] = MAXNUM;
        statu[i] = false;
    }
    maxn[1] = 0;
    for (int i = 1; i <= n; i++) {
        int x = 1;
        long long maxtmp = MAXNUM;
        for (int j = 1; j <= n; j++) {
            if (maxn[j] < maxtmp && !statu[j]) {
                x = j;
                maxtmp = maxn[j];
            }
        }
        statu[x] = true;
        for (int j = 1; j <= n; j++) {
            if (maxn[j] > maxn[x] + edge[x][j] && edge[x][j] != -1 && edge[x][j]) {
                maxn[j] = maxn[x] + edge[x][j];
            }
        }
    }
    long long minn = 0;
    for (int i = 1; i <= n; i++) {
        if (minn < maxn[i])
            minn = maxn[i];
    }

    return minn;
}

int main()
{
    char charNum[100];
    long long numtmp;

    while (scanf("%d", &n) != EOF) {
        edge[1][1] = 0;
        for (int i = 2; i <= n; i++) {
            edge[i][i] = 0;
            for (int j = 1; j < i; j++) {
                scanf("%s", &charNum);
                if (charNum[0] == 'x')
                    numtmp = -1;
                else
                    sscanf(charNum, "%lld", &numtmp);
                edge[i][j] = numtmp;
                edge[j][i] = numtmp;
            }
        }
//        for (int i = 1; i <= n; i++) {
//            for (int j = 1; j <= n; j++) {
//                printf("%lld\t", edge[i][j]);
//            }
//            printf("\n");
//        }
        printf("%d\n", dijkstra());
    }

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值