A. Infinity Gauntlets
水题,模拟
B. High School: Become Human
取对数比较
D.Fair
- 有n个城市,m条路,保证任意城市都相通,保证任意两个城市之间都只有1条路径。现在,要在某一个城市举办一场盛会,每个城市都会生产1种商品(不同城市之间生产的商品可能相同)共有k种不同的商品,现在,举办盛会需要s种不同的商品。每种商品都需要走到相应的城市去取。分别输出在n个城市举办盛会需要走的路(边权都为1)
- 由于边权都为1,直接BFS,把每个生产 i i 型商品城市到所有其他城市的最短路径求出。
- 代码
#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;
}