• CodeForces


    题意:有N个点M条边的无向图,每个点有给定的ai(1<=ai<=K,K<=200)表示该点拥有的物品编号,保证1-K在N个点全部出现。求每个点收集S个不同的物品所要走过的最短路程(边的长度为1)。

    分析:N是1e5,如果直接对每个点搜索肯定超时。发现K的范围很小,而且1-K全部覆盖。那么考虑对所有1-K的值BFS,用一个二维数组dp[i][j]记录i点要获取编号为j的物品最少走过的路程,并对每个点取最小的S个物品对应的路径。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int maxn =1e5+5;
    int a[maxn];
    int res[maxn];
    vector<int> G[maxn];
    bool vis[maxn];
    int d[maxn][305];
    void init(int N)    {for(int i=1;i<=N;++i) G[i].clear();}
    void AddEdge(int u,int v){G[u].push_back(v);}
    
    void BFS(int val,int N)
    {
        memset(vis,0,sizeof(vis));
        queue<int> Q;
        for(int i=1;i<=N;++i){
            if(a[i]==val){
                vis[i]=true;
                Q.push(i);
            }
        }
        while(!Q.empty()){
            int x =Q.front();Q.pop();
            for(int i=0;i<G[x].size();++i){
                int v = G[x][i];
                if(!vis[v]){
                    vis[v] = true;
                    d[v][val] = d[x][val]+1;
                    Q.push(v);
                }
            }
        }
    }
    
    int main()
    {
        #ifndef ONLINE_JUDGE
            freopen("in.txt","r",stdin);
            freopen("out.txt","w",stdout);
        #endif
        int N,M,K,S,u,v;
        while(scanf("%d%d%d%d",&N,&M,&K,&S)==4){
            init(N);
            memset(d,0,sizeof(d));
            for(int i=1;i<=N;++i) scanf("%d",&a[i]);
            for(int i=1;i<=M;++i){
                scanf("%d%d",&u,&v);
                AddEdge(u,v);
                AddEdge(v,u);
            }
            for(int i=1;i<=K;++i){
                memset(vis,0,sizeof(vis));
                BFS(i,N);
            }
            for(int i=1;i<=N;++i){
                sort(d[i]+1,d[i]+K+1);
                res[i]=0;
                for(int j =1;j<=S;++j){
                    res[i]+=d[i][j];
                }
            }
            for(int i=1;i<N;++i) printf("%d ",res[i]);
            printf("%d
    ",res[N]);
        }
        return 0;
    }
    为了更好的明天
  • 相关阅读:
    047.Python前端html
    Python利用PyExecJS库执行JS函数-实战破解字段加密
    Frida用法之函数操作
    Frida的安装步骤基于Android系统组合Python语言
    利用Python多线程来测试并发漏洞
    微信公众号:Mysticbinary
    Windows系统下解决PhPStudy MySQL启动失败
    crontab 定时任务没有响应 检测步骤
    解决Android killer APK 编译失败,无法继续下一步签名
    Python操作MySQL的一些坑
  • 原文地址:https://www.cnblogs.com/xiuwenli/p/9380154.html
Copyright © 2020-2023  润新知