A. Infinity Gauntlets
水題,模擬
B. High School: Become Human
取對數比較
D.Fair
- 有n個城市,m條路,保證任意城市都相通,保證任意兩個城市之間都只有1條路徑。現在,要在某一個城市舉辦一場盛會,每個城市都會生產1種商品(不同城市之間生產的商品可能相同)共有k種不同的商品,現在,舉辦盛會需要s種不同的商品。每種商品都需要走到相應的城市去取。分別輸出在n個城市舉辦盛會需要走的路(邊權都爲1)
- 由於邊權都爲1,直接BFS,把每個生產 型商品 城市到所有其他城市的最短路徑求出。
- 代碼
#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;
}