返回题目问答
讨论 / 题目问答/ 帖子详情

这题确定不是网站卡常了吗?

#define For(i,a,b) for(i=a;i<=b;i++)
#define FOR(i,a,b) for(i=a;i>=b;i--)
using namespace std;
const int N=5e3+10;
int dis[N],c[N];
bool vis[N],st[N];
vector<int> p[N],vec[N];
void add(int u,int v){
	p[u].push_back(v);
}
struct node{
	int x,dis;
};
void bfs01(int s){
	memset(dis,0x3f,sizeof dis);
	memset(vis,0,sizeof vis);
	memset(st,0,sizeof st);
	deque<node> q;
	q.push_back({s,0});
	dis[s]=0;
	while(q.size()){
		node cur=q.front();
		q.pop_front();
		if(vis[cur.x]) continue;
		vis[cur.x]=1;
		if(!st[c[cur.x]]){
			for(unsigned i=0;i<vec[c[cur.x]].size();i++){
				int u=vec[c[cur.x]][i];
				if(cur.dis<dis[u]){
					dis[u]=cur.dis;
					q.push_front({u,cur.dis});
				}
			}
			st[c[cur.x]]=1;
		}
		for(unsigned i=0;i<p[cur.x].size();i++){
			int u=p[cur.x][i];
			if(cur.dis+1<dis[u]){
				dis[u]=cur.dis+1;
				q.push_back({u,dis[u]});
			}
		}
	}
}
signed main(){
//	freopen("1.in","r",stdin);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int i,n,m;
	cin>>n>>m;
	For(i,1,n) cin>>c[i],vec[c[i]].push_back(i);
	For(i,1,n-1){
		int u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	while(m--){
		int s,t;
		cin>>s>>t;
		bfs01(s);
		cout<<dis[t]<<'\n';
	}
	return 0;
}

```
1 回复 0 转发 0 喜欢 69 阅读
回复 (1)
默认 最新
admin 2024/4/24
默认开了O2,应该不怎么卡常
0