思路:
可以先用bfs计算出每一种商品到每个点的最短距离。最后对每个点的所有商品的距离排序,取最小的s个。
代码:
#include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<queue> using namespace std; #define inf 0x3f3f3f3f #define MAXN 100005 int n,m,s,k,a[MAXN],dis[MAXN][105]; vector<int> vec[MAXN],col[105]; struct node { int u,step; }p; void bfs(int c) { queue<node> q; for(int i=0;i<col[c].size();i++) { p.u=col[c][i]; p.step=0; dis[p.u][c]=0; q.push(p); } while(!q.empty()) { node top=q.front(); q.pop(); for(int i=0;i<vec[top.u].size();i++) { int v=vec[top.u][i]; if(dis[v][c]<=top.step+1) continue; p.u=v; p.step=top.step+1; dis[v][c]=p.step; q.push(p); } } } int main() { scanf("%d%d%d%d",&n,&m,&k,&s); for(int i=1;i<=k;i++) col[i].clear(); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); col[a[i]].push_back(i); } for(int i=0;i<m;i++) { int u,v; scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } for(int i=1;i<=n;i++) for(int j=1;j<=k;j++) dis[i][j]=inf; for(int i=1;i<=k;i++) bfs(i); for(int i=1;i<=n;i++) { sort(dis[i]+1,dis[i]+k+1); int ans=0; for(int j=1;j<=s;j++) ans+=dis[i][j]; if(i>1) printf(" "); printf("%d",ans); } printf("\n"); return 0; }