题目链接 codeforces 959 B
题意
输入 n, k, m; 输入n个单词,然后 输入n个整数,代表第 i 个单词的花费,接下来K行,每行输入的元素代表一组,一组内的单词可相互替换,最后输入m个单词,求最小花费。
题解:
用并查集的思想,某个组的最小代表这个组
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
map<string, int> ma; // 存储单词下标
int a[100005];ll cost[100005]; // a数组标记某个元素最终属于哪个组,cost表示花费
void merge(int x,int y){
cost[x] = cost[y] = min(cost[x],cost[y]); // 取组内最小的花费
a[y] = x; // 组内最小花费的下标
}
int main(){
int n, k, m;
string s;
cin >> n >> k >> m;
for(int i = 1; i <= n; i++){
cin >> s;
ma[s] = i;
a[i] = i;
}
for(int i = 1; i <= n; i++){
cin >> cost[i];
}
for(int i = 1; i <= k; i++){
int g, w;
cin >> g >> w;
for(int j = 2; j <= g; j++){
int u;
cin >> u;
merge(w, u); // 都和组内第一个元素合并
}
}
ll ans = 0;
for(int i = 1; i <= m; i++){
cin >> s;
ans = ans + cost[a[ma[s]]]; // 组内最小元素的花费
}
cout << ans << endl;
return 0;
}