【牛客 - 330G】Applese 的毒气炸弹(最小生成树,构造,判连通图)
生活随笔
收集整理的這篇文章主要介紹了
【牛客 - 330G】Applese 的毒气炸弹(最小生成树,构造,判连通图)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題干:
?
眾所周知,Applese 是個很強的選手,它的化學一定很好。
今天他又AK了一套題覺得很無聊,于是想做個毒氣炸彈玩。
毒氣炸彈需要 k 種不同類型元素構成,Applese一共有 n 瓶含有這些元素的試劑。
已知元素混合遵循 m 條規律,每一條規律都可以用 "x y c" 描述。
表示將第 x 瓶試劑混入第 y 瓶試劑或者把第 y 瓶試劑混入第 x 瓶試劑,需要消耗 c 的腦力。
?
特別地,除了這?m?條規律外,Applese 可以將任意兩瓶相同元素的試劑混合,且不需要消耗腦力。
?
Applese 想要配出毒氣炸彈,就需要使 S 中含有 1~k1~k 這 k 種元素。它想知道自己最少花費多少腦力可以把毒氣炸彈做出來。
輸入描述:
第一行為三個整數 n, m, k 表示 Applese 擁有的試劑的數量,混合規律的數量和所需的元素種類數。 第二行為 n 個整數 a1,a2,…,ana1,a2,…,an,分別表示每一瓶試劑的元素類型。 接下來m行,每行三個整數 x, y, c,含義如題目描述中所述。不保證 x, y的試劑種類不同。輸出描述:
輸出一個正整數表示最小的耗費腦力。特別地,如果無法合成出毒氣炸彈,輸出 "-1"。示例1
輸入
復制
6 8 2 1 1 1 2 2 2 1 2 1 2 3 2 1 3 3 3 4 6 4 5 1 4 6 3 5 6 2 1 6 2輸出
復制
2備注:
1≤n,k,m≤1051≤n,k,m≤105 1≤x,y≤n,x≠y1≤x,y≤n,x≠y 1≤c≤109?
解題報告:
看成一張圖,就是把同類元素的試劑當作一個點之后,求這個圖的最小生成樹就行了。注意判不連通的情況。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e5 + 5; struct Edge {int u,v;int c;Edge(){}Edge(int u,int v,int c):u(u),v(v),c(c){}bool operator<(const Edge b) const{return c < b.c;} } e[MAX]; int tot; int a[MAX]; int f[MAX]; int getf(int v) {return f[v] == v ? v : f[v] = getf(f[v]); } void merge(int u,int v) {int t1 = getf(u);int t2 = getf(v);f[t2] = t1; }int main() {int n,m,k;cin>>n>>m>>k;for(int i = 1; i<=k; i++) f[i] = i;for(int i = 1; i<=n; i++) cin>>a[i];for(int x,y,c,i = 1; i<=m; i++) {cin>>x>>y>>c;if(a[x] != a[y]) e[++tot] = {a[x],a[y],c};}sort(e+1,e+tot+1);ll ans = 0,cnt = 0;for(int u,v,i = 1; i<=tot; i++) {u = e[i].u;v = e[i].v;if(getf(u) == getf(v)) continue;cnt++;merge(u,v);ans += 1ll*e[i].c;if(cnt == k-1) break;}if(cnt != k-1) puts("-1");else printf("%lld\n",ans);return 0 ;}?
總結
以上是生活随笔為你收集整理的【牛客 - 330G】Applese 的毒气炸弹(最小生成树,构造,判连通图)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为重申不造车!徐直军:中国不缺华为品牌
- 下一篇: 【Kattis - triangle 】