Lib/木の直径
重み付き
code:cpp
int graph_diameter(vector<vector<pair<int,int>>> &vec){
//0-indexed
queue<pair<int,int>> que;
vector<bool> is_searched(vec.size(),false);
que.push(make_pair(0,0));
int max_d = 0;
int max_e = 0;
while(!que.empty()){
int e = que.front().first;
int distance = que.front().second;
is_searchede = true;
if(max_d<distance){
max_d = distance;
max_e = e;
}
que.pop();
rep(i,(int)vece.size()){
if(!is_searched[vecei.first]){
que.push( make_pair( vecei.first, distance +vecei.second) );
}
}
}
fill(is_searched.begin(),is_searched.end(),false);
que.push(make_pair(max_e,0));
max_d = 0;
max_e = 0;
while(!que.empty()){
int e = que.front().first;
int distance = que.front().second;
is_searchede = true;
if(max_d<distance){
max_d = distance;
max_e = e;
}
que.pop();
rep(i,(int)vece.size()){
if(!is_searched[vecei.first]){
que.push( make_pair( vecei.first, distance +vecei.second) );
}
}
}
return max_d;
}
重みなし
code:cpp
ll getfar(vector<vector<ll>> g,ll start,vector<ll> &d){
ll n = g.size();
vector<bool> is_see(n,false);
queue<pair<ll,ll>> que;
que.push({start,0});
is_seestart = true;
ll mdist = 0;
ll mdistp = 0;
while(!que.empty()){
auto p,dist = que.front();
que.pop();
dp = dist;
if(mdist < dist){
mdist = dist;
mdistp = p;
}else if(mdist == dist){
chmax(mdistp,p);
}
for(auto next : gp){
if(!is_seenext){
is_seenext = true;
que.push({next,dist+1});
}
}
}
return mdistp;
}
#Lib
古いので書き換えたい