社区讨论

求问

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 条回复,欢迎继续交流。

正在加载回复...