zoukankan      html  css  js  c++  java
  • 50网络延迟时间(743)

    作者: Turbo时间限制: 1S章节: DS:图

    晚于: 2020-08-05 12:00:00后提交分数乘系数50%

    截止日期: 2020-08-12 12:00:00

    问题描述 :

    有 N 个网络节点,标记为 1 到 N。

    给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。

    现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。

    示例:

    无标题.png

    输入:times = [[2,1,1],[2,3,1],[3,4,1]], N = 4, K = 2

    输出:2

    可使用以下main函数:

    int main()

    {

        int N,M,K;

        vector<vector<int> > times;

        cin>>N>>M>>K;

        int u,v,w;

        for(int i=0; i<M; i++)

        {

            cin>>u>>v>>w;

            vector<int> time;

            time.push_back(u);

            time.push_back(v);

            time.push_back(w);

            times.push_back(time);

        }

        int res=Solution().networkDelayTime(times,N,K);

        cout<<res<<endl;

    }

    输入说明 :

    首先输入网络节点个数N,传递时间列表 times的长度M,起始节点K

    然后输入M行,每行三个整数(u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。

    N 的范围在 [1, 100] 之间。

    K 的范围在 [1, N] 之间。

    times 的长度M在 [1, 6000] 之间。

    所有的边 times[i] = (u, v, w) 都有 1 <= u, v <= N 且 0 <= w <= 100。

    输出说明 :

    输出一个整数,表示结果。

    输入范例 :

    输出范例 :

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std; 
    class Solution {
    public:
        int flag = 1000;
        vector<vector<int>> G;//
        int n;
        int root;//源节点
        vector<int> set;//存储已找到最短路径的结点
        vector<int> dis;//存储最短路径
        void dijkstra()
        {
            set[root] = 1;
            dis[root] = 0;
            for (int i = 1; i <= n; i++)
            {
                int k = 0;
                for (int j = 1; j <= n; j++)//找出距离最近的点
                    if (!set[j] && (k == 0 || dis[j] < dis[k]))
                        k = j;
                set[k] = 1;//加入集合
                for (int j = 1; j <= n; ++j)//更新
                    if (!set[j] && dis[k] + G[k][j] < dis[j])
                        dis[j] = dis[k] + G[k][j];
            }
        }
        int networkDelayTime(vector<vector<int>>& times, int N, int K)
        {
            G.resize(N+1,vector<int>(N+1,flag));
            
            root = K;
            n = N;
            dis.resize(N + 1, flag);//容量加1是因为也要存储本身的节点 
            set.resize(N + 1, 0);
            for (auto temp : times)
            {
                if (temp[0] == K)
                    dis[temp[1]] = temp[2];
                G[temp[0]][temp[1]] = temp[2];
            }
            dijkstra();
            int res = *max_element(dis.begin() + 1, dis.end());
            return res == flag ? -1 : res;
        }
    };
    int main()
    {
        int N,M,K;
        vector<vector<int> > times;
        cin>>N>>M>>K;
        int u,v,w;
        for(int i=0; i<M; i++)
        {
            cin>>u>>v>>w;
            vector<int> time;
            time.push_back(u);
            time.push_back(v);
            time.push_back(w);
            times.push_back(time);
        }
        int res=Solution().networkDelayTime(times,N,K);
        cout<<res<<endl;
    }
  • 相关阅读:
    volley框架使用
    Insert Interval
    candy(贪心)
    Best Time to Buy and Sell Stock
    Best Time to Buy and Sell Stock III
    distinct subsequences
    edit distance(编辑距离,两个字符串之间相似性的问题)
    trapping rain water
    word break II(单词切分)
    sudoku solver(数独)
  • 原文地址:https://www.cnblogs.com/zmmm/p/13634284.html
Copyright © 2011-2022 走看看