牛客S2第9场 - 钻石&王者 最大可能的直径
https://ac.nowcoder.com/acm/contest/9977/C
这题让找基环树删除环上一边之后最大的直径
我枚举删除环上的边写的,很暴力,希望路过的大佬告诉我更加高效的写法
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<cstring>
#include<stack>
using namespace std;
const int maxn = 5e3+111;
vector<int>G[maxn];
void add(int x,int y){
G[x].push_back(y);
}
int dp[maxn];
int ans;
int n;
int mp[maxn][maxn];
int dfs(int x,int fa){
dp[x] = 1;
int mx = -1;
for(int i=0;i<G[x].size();i++){
int p = G[x][i];
if(p == fa || mp[x][p]) continue;
dfs(p,x);
dp[x] = max(dp[p] + 1,dp[x]);
if(mx == -1) mx = dp[p];
else{
ans = max(dp[p] + mx + 1,ans);
mx = max(dp[p],mx);
}
}
return 0;
}
int vis[maxn];
vector<int>ins;
stack<int>s;
int tarjan(int x,int fa){
if(vis[x]) {
if(ins.size() != 0) return 0;
ins.push_back(x);
while(s.size()){
int a = s.top();
s.pop();
ins.push_back(a);
if(a == x) break;
}
return 0;
}
s.push(x);
vis[x] = 1;
for(int i=0;i<G[x].size();i++){
int p = G[x][i];
if(p == fa) continue;
tarjan(p,x);
}
if(s.size()) s.pop();
return 0;
}
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param n int整型
* @param u int整型vector
* @param v int整型vector
* @return int整型
*/
int MaxDiameter(int m, vector<int>& u, vector<int>& v) {
// write code here
n = m;
for(int i=0;i<u.size();i++){
int x = u[i];
int y = v[i];
add(x,y);
add(y,x);
}
tarjan(1,0);
for(int i=1;i<ins.size();i++){
int x = ins[i-1];
int y = ins[i];
mp[x][y] = 1;
mp[y][x] = 1;
dfs(1,-1);
mp[x][y] = 0;
mp[y][x] = 0;
}
return ans-1;
}
};
寻找真正的热爱

浙公网安备 33010602011771号