Codeforces Round #485 (Div. 2) contest 987

A. Infinity Gauntlets

水題,模擬

B. High School: Become Human

取對數比較

D.Fair

  • 有n個城市,m條路,保證任意城市都相通,保證任意兩個城市之間都只有1條路徑。現在,要在某一個城市舉辦一場盛會,每個城市都會生產1種商品(不同城市之間生產的商品可能相同)共有k種不同的商品,現在,舉辦盛會需要s種不同的商品。每種商品都需要走到相應的城市去取。分別輸出在n個城市舉辦盛會需要走的路(邊權都爲1)
  • 由於邊權都爲1,直接BFS,把每個生產i 型商品(1ik) 城市到所有其他城市的最短路徑求出。
  • 代碼
#include <bits/stdc++.h>
using namespace std;

const int maxn=1e6+10;
int m,n,k,s,u,v,ans;
int good[maxn],mov[maxn][110];
vector<int> e[maxn];

void bfs(int x)
{
    queue<int>q;
    q.push(x+n);
    while(q.size())
    {
        int u=q.front();
        q.pop();
        for(int i=0;i<e[u].size();++i)
        {
            int v=e[u][i];
            if(!mov[v][x])
            {
                mov[v][x]=mov[u][x]+1;
                q.push(v);
            }
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m>>k>>s;
    for(int i=1;i<=n;++i)
    {
        cin>>good[i];
        e[good[i]+n].push_back(i);//用一個虛擬結點,方便進行BFS
    }
    for(int i=0;i<m;++i)
    {
        cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    for(int i=1;i<=k;++i)
        bfs(i);
    for(int i=1;i<=n;++i)
    {
        ans=0;
        sort(mov[i]+1,mov[i]+k+1);
        for(int j=1;j<=s;++j)
            ans+=mov[i][j]-1;//由於有虛擬結點,所以要減一
        cout<<ans<<" ";
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章