题目问答
题目问答简介
这题确定不是网站卡常了吗?
```
#include
#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
70



