列表

详情


XM34. 分布式集群消息传递

描述

有一个分布式服务集群,集群内含有 N 个服务节点,分别标记为 1 到 N。
给予一个列表 times,表示消息从两个节点间有向传递需要的时间。 times[i] = (s, d, t),其中 s 表示发出消息的源节点,d 表示接收到消息的目标节点, t  表示信息有向传递的时间。
现在 K 节点发送了一个信号,请问至少需要多少秒才能使所有的服务节点都收到该消息?如果消息不能传递给集群内全部节点,则返回-1。

输入描述

第一行:列表 times。分布式服务集群的图,图的结构为二维数组。例如: [[2,1,1],[2,3,1],[3,4,1]] ,表示集群4个节点,2到1的时间为1,2到3的时间为1,3到4的时间为1;
第二行:N值
第三行:K值
范围约束:
1. N 的范围在 [1, 100] 之间。
2. K 的范围在 [1, N] 之间。
3. times 的长度在 [1, 6000] 之间。
4. 所有的边 times[i] = (s, d, t) 都有 1 <= s, d <= N 且 1 <= t <= 100。

输出描述

至少需要多少秒才能使所有的服务节点都收到该消息?如果消息不能传递给集群内全部节点,则返回-1

示例1

输入:

[[2,1,1],[2,3,1],[3,4,1]]
4
2

输出:

2

原站题解

C++14 解法, 执行用时: 4ms, 内存消耗: 388KB, 提交时间: 2020-07-29

#include<stdio.h>
#include<string.h>
#define INF 0x3fffffff
const int maxn = 104;
int G[maxn][maxn], vis[maxn], d[maxn];
int n, k;
void Dijkstra(int s) {
    d[s] = 0;
    for(int i = 0; i < n; i++) {
        int u = -1, mind = INF;
        for(int j = 1; j <= n; j++) {
            if(!vis[j] && mind > d[j]) {
                mind = d[j];
                u = j;
            }
        }
        if(u == -1)
            return;
        vis[u] = 1;
        for(int v = 1; v <= n; v++) {
            if(!vis[v]&&G[u][v] != INF && d[v] > d[u] + G[u][v])
                d[v] = d[u] + G[u][v];
        }
    }
}
int main() {
   // freopen("input.txt", "r", stdin);
    // freopen("input.txt", "a", stdout);
    for(int i = 0; i < maxn; i++)
        for(int j = 0; j < maxn; j++) {
            if(i == j)
                G[i][j] = 0;
            else
                G[i][j] = INF;
        }
    char c = getchar();
    int u, v, x;
    while(c != ']') {
        scanf("[%d,%d,%d]", &u, &v, &x);
        if(u != v && x < G[u][v]) {
            G[u][v]= x;
        }
        c = getchar();
    }
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= n; i++) {
        vis[i] = 0;
        d[i] = INF;
    }
    Dijkstra(k);
    int maxt=d[k];
    for(int i=1;i<=n;i++){
        if(maxt<d[i])
            maxt=d[i];
    }
    if(maxt==INF)
        printf("-1");
    else
        printf("%d",maxt);
    return 0;
}

C++ 解法, 执行用时: 4ms, 内存消耗: 476KB, 提交时间: 2020-10-29

#include <bits/stdc++.h>
using namespace std;

int N, K, G[101][101], dis[101];
bool vis[101];

void dijkstra(int s){
    dis[s] = 0;
    for(int i=0;i<N;i++){
        int k=0, Min=INT_MAX;
        for(int j=1;j<=N;j++){
            if(!vis[j] && dis[j]<Min){
                Min = dis[j];
                k = j;
            }
        }
        if(k==0)
            break;
        vis[k] = true;
        for(int v=1;v<=N;v++){
            if(!vis[v] && G[k][v]!=INT_MAX && dis[v]>dis[k]+G[k][v])
                dis[v] = dis[k] + G[k][v];
        }
    }
}

int main(){
    int s, d, t, Max=0;
    memset(vis, false, sizeof(vis));
    for(int i=0;i<101;i++){
        dis[i] = INT_MAX;
        for(int j=0;j<101;j++){
            if(i==j)
                G[i][j] = 0;
            else
                G[i][j] = INT_MAX;
        }
    }
    char c = getchar();
    while(c!=']'){
        scanf("[%d,%d,%d]", &s, &d, &t);
        if(s!=d && t<G[s][d])
            G[s][d] = t;
        c = getchar();
    }
    scanf("%d%d", &N, &K);
    dijkstra(K);
    for(int i=1;i<=N;i++)
        Max = max(Max, dis[i]);
    if(Max==INT_MAX)
        printf("-1\n");
    else
        printf("%d\n", Max);
    return 0;
}

上一题