最短路
首先用dijkstra算法来求取每个点是否可达。然后对于任意两点u和v之间的细分点,用u*n+v来表示从u到v的路径上可达的细分点有多少,这一步可以由哈希表map来记录。最后枚举所有的边,这个边上的可达的细分点为min(cnt,map[u*n+v]+map[v*n+u]),累加到答案上即可。
class Solution {
public:
int reachableNodes(vector<vector<int>>& edges, int maxMoves, int n) {
vector<vector<pair<int,int>>> g(n);
map<int,int> c;
vector<int> vis(n,0);
for(auto p:edges){
g[p[0]].push_back({p[1],p[2]});
g[p[1]].push_back({p[0],p[2]});
}
int ans=0;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
q.push({0,0});
while(!q.empty()&&q.top().first<=maxMoves){
auto [d,x]=q.top();
q.pop();
if(vis[x]) continue;
vis[x]=1;
ans++;
for(auto [y,t]:g[x]){
if(d+t+1<=maxMoves&&!vis[y]){
q.push({d+t+1,y});
}
c[x*n+y]=min(t,maxMoves-d);
}
}
for(auto p:edges){
int u=p[0],v=p[1],cnt=p[2];
ans+=min(cnt,c[u*n+v]+c[v*n+u]);
}
return ans;
}
};
时间复杂度:O(mlogn),m为边数,n为点数
空间复杂度:O(m+n)