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;
}
posted @ 2026-03-17 17:00  peter_shen  阅读(8)  评论(0)    收藏  举报