社区讨论
求问
P3629[APIO2010] 巡逻参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mjmj7633
- 此快照首次捕获于
- 2025/12/26 15:09 2 个月前
- 此快照最后确认于
- 2025/12/27 22:35 2 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
vector<pair<int,int> > g[N],G[N];
int n,k,dp[N],p,s,t;
int x[N],y[N],ans;
int f[N],len,dis[N],fa[N];
map<pair<int,int>,bool> mp;
void dfs2(int x,int pre){
for(int i = 0;i<g[x].size();i++){
int to = g[x][i].first,d = g[x][i].second;
if(to == pre) continue;
f[to] = f[x]+d;
if(f[to]>f[p]) p = to;
dfs2(to,x);
}
}
void dfs(int x,int pre){
for(int i = 0;i<G[x].size();i++){
int to = G[x][i].first;
int d = G[x][i].second;
if(to == pre) continue;
dfs(to,x);
ans = max(ans,dp[x]+dp[to]+d);
dp[x] = max(dp[x],dp[to]+d);
}
}
int main(){
cin>>n>>k;
for(int i = 1;i<=n-1;i++){
cin>>x[i]>>y[i];
g[x[i]].push_back({y[i],1});
g[y[i]].push_back({x[i],1});
}
p = 1; dfs2(p,-1); s = p;
f[p] = 0; dfs2(p,0); t = p;
len = f[p];
if(k == 1){
cout<<2*(n-1)-len+1;
return 0;
}
memset(dis,-1,sizeof(dis));
queue<int> q;
q.push(s); dis[s] = 0;
while(!q.empty()){
int x = q.front();
q.pop();
for(int i = 0;i<g[x].size();i++){
int to = g[x][i].first;
if(dis[to] == -1){
dis[to] = dis[x]+1;
fa[to] = x;
q.push(to);
}
}
}
int pass = t;
vector<int> v;
for(int i = 0;i<dis[t];i++){
v.push_back(fa[pass]);
pass = fa[pass];
}
for(int i = 1;i<v.size();i++){
mp[{v[i],v[i-1]}] = 1;
mp[{v[i-1],v[i]}] = 1;
}
for(int i = 1;i<=n-1;i++){
if(mp[{x[i],y[i]}] || mp[{y[i],x[i]}]){
G[x[i]].push_back({y[i],-1});
G[y[i]].push_back({x[i],-1});
}else{
G[x[i]].push_back({y[i],1});
G[y[i]].push_back({x[i],1});
}
}
dfs(1,-1);
cout<<2*(n-1)-len+1-ans+1<<endl;
return 0;
}/*
*/
为什么样例过不了,却AC了
回复
共 1 条回复,欢迎继续交流。
正在加载回复...