链式前向星复习
很久没写图论的题了,生疏了,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; } };
大

浙公网安备 33010602011771号