1211: 小镇购物
多源BFS,下面这个代码会超时,我得把node节点去掉,vis使用时间戳
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int K=105;
int n,m,k,s;
int num[N];
vector<int> mp[N];
vector<int> vec[K]; //记录的是卖同一个商品的有哪些店
int dij[N][K]; //dij[i][j] 表示的是第i家店到第j种商品的最短距离
int vis[N];
struct node{
int t ;
int w;
};
int timer=0;
queue<node> que;
void bfs(int i){
timer++;
que=queue<node> ();
//memset(vis,0,sizeof(vis));
for(int j=0;j<vec[i].size();j++){
que.push({vec[i][j],0});
vis[vec[i][j]]=timer;;
}
while(!que.empty()){
auto now=que.front();
que.pop();
dij[now.t][i]=now.w;
for(int j=0;j<mp[now.t].size();j++){
if(vis[mp[now.t][j]]!=timer){
que.push({mp[now.t][j],now.w+1});
vis[mp[now.t][j]]=timer;
}
}
}
}
int main(){
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF){
memset(dij,0x7f,sizeof(dij));
for (int i = 1; i <= n; i++) mp[i].clear();
for (int i = 1; i <= k; i++) vec[i].clear();
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
vec[num[i]].push_back(i);
}
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
mp[u].push_back(v);
mp[v].push_back(u);
}
timer=0;
for(int i=1;i<=k;i++){
bfs(i);
}
for(int i=1;i<=n;i++){
sort(dij[i]+1,dij[i]+k+1);
int sum=0;
for(int j=1;j<=s;j++){
sum+=dij[i][j];
}
printf("%d ",sum);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int K = 105;
const int INF = 0x3f3f3f3f;
int n, m, k, s;
int num[N];
int dij[N][K];
int vis[N], timer_;
vector<int> mp[N];
vector<int> vec[K];
void bfs(int kind) {
queue<int> q;
++timer_;
for (int x : vec[kind]) {
q.push(x);
vis[x] = timer_;
dij[x][kind] = 0;
}
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : mp[u]) {
if (vis[v] != timer_) {
vis[v] = timer_;
dij[v][kind] = dij[u][kind] + 1;
q.push(v);
}
}
}
}
int main() {
while (scanf("%d%d%d%d", &n, &m, &k, &s) != EOF) {
for (int i = 1; i <= n; i++) mp[i].clear();
for (int i = 1; i <= k; i++) vec[i].clear();
memset(dij, 0x3f, sizeof(dij));
for (int i = 1; i <= n; i++) {
scanf("%d", &num[i]);
vec[num[i]].push_back(i);
}
for (int i = 1; i <= m; i++) {
int u, v;
scanf("%d%d", &u, &v);
mp[u].push_back(v);
mp[v].push_back(u);
}
timer_ = 0;
for (int i = 1; i <= k; i++) bfs(i);
for (int i = 1; i <= n; i++) {
sort(dij[i] + 1, dij[i] + k + 1);
int sum = 0;
for (int j = 1; j <= s; j++) sum += dij[i][j];
printf("%d ", sum);
}
printf("\n");
}
return 0;
}

浙公网安备 33010602011771号