链式前向星复习

很久没写图论的题了,生疏了,c++式建图都不会了(丑陋)

水题在这里:

概述题意:

  给一个无向图,从原点开始求最长的路径长度(再稍处理一下)

其实主要是记录一下c++式的建图(没写过)

定义:

 

int num;
    struct ii
    {
        int to, next;
        ii(int x, int y) : to(x), next(y) {}
    };
    vector<int> head;
    vector<ii> mp;
    void add(int x, int y)
    {
        mp.emplace_back(y, head[x]);
        head[x] = ++num;
    }

 

初始化:

 

        vector<int> ans(n, 0);
        head = ans, num = 0;
        mp.emplace_back(0, 0);     

 

切记有一个mp.emplace_back()的预处理,因为一定是要下标从1开始

ACcode:

 

class Solution
{
    int num;
    struct ii
    {
        int to, next;
        ii(int x, int y) : to(x), next(y) {}
    };
    vector<int> head;
    vector<ii> mp;
    void add(int x, int y)
    {
        mp.emplace_back(y, head[x]);
        head[x] = ++num;
    }

public:
    int networkBecomesIdle(vector<vector<int>> &edges, vector<int> &patience)
    {
        int n = patience.size(), mx = 0;
        vector<int> ans(n, 0);
        head = ans, num = 0;
        mp.emplace_back(0, 0);

        for (auto i : edges)
            add(i[0], i[1]), add(i[1], i[0]);

        queue<pair<int, int>> q;
        q.push({0, 0});
        while (q.size())
        {
            int u = q.front().first, v = q.front().second;
            q.pop();
            for (int i = head[u]; i; i = mp[i].next)
            {
                int y = mp[i].to;
                if (y == 0)
                    continue;
                if (ans[y] == 0)
                {
                    ans[y] = v + 1;
                    q.push({y, v + 1});
                }
            }
        }
        for (int i = 1; i < n; ++i)
            mx = max(mx, 2 * 2 * ans[i] - (2 * ans[i] % patience[i] ? 2 * ans[i] % patience[i] : patience[i]));
        return mx + 1;
    }
};
ac

 

 

  

posted @ 2022-03-20 15:36  Renhr  阅读(24)  评论(0)    收藏  举报