fresh_boy 题目问答 · 2024/4/23
这题确定不是网站卡常了吗?
``` #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