1. 程式人生 > >牛客寒假算法基礎集訓營4 G Applese 的毒氣炸彈

牛客寒假算法基礎集訓營4 G Applese 的毒氣炸彈

ons 表示 算法基礎 char while lan tin union 牛客網

鏈接:https://ac.nowcoder.com/acm/contest/330/G
來源:牛客網

眾所周知,Applese 是個很強的選手,它的化學一定很好。


今天他又AK了一套題覺得很無聊,於是想做個毒氣炸彈玩。

毒氣炸彈需要 k 種不同類型元素構成,Applese一共有 n 瓶含有這些元素的試劑。

已知元素混合遵循 m 條規律,每一條規律都可以用 "x y c" 描述。

表示將第 x 瓶試劑混入第 y 瓶試劑或者把第 y 瓶試劑混入第 x 瓶試劑,需要消耗 c 的腦力。

特別地,除了這 m 條規律外,Applese 可以將任意兩瓶相同元素的試劑混合,且不需要消耗腦力。

Applese 想要配出毒氣炸彈,就需要使 S 中含有 1k

把元素當作節點,需要k種元素。涉及合並。然後最小生成樹

復習:記錄邊權,排序,選k-1條邊

find函數已經忘了。 初始化fa數組 為 -1

find(x) 如果 fa[x]==-1 說明x就是根

否則 return fa[x]=find(fa[x]) 也就是一直往上查找

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=100010;
 4 int kind[maxn],n,m,k,fa[maxn];
5 6 struct Edge{ 7 int u,v,c; 8 }edge[maxn]; 9 10 bool cmp(Edge a,Edge b) { 11 return a.c<b.c; 12 } 13 14 int find(int x) { 15 if(fa[x]==-1) return x; 16 else return fa[x]=find(fa[x]); 17 } 18 19 void Union(int x,int y) { 20 int fx=find(x); 21 int
fy=find(y); 22 fa[fx]=fy; 23 } 24 25 int main() { 26 scanf("%d%d%d",&n,&m,&k); 27 for(int i=1;i<=n;i++) scanf("%d",&kind[i]); 28 int id=0; 29 long long ans=0; 30 while(m--) { 31 scanf("%d%d%d",&edge[id].u,&edge[id].v,&edge[id++].c); 32 } 33 memset(fa,-1,sizeof(fa)); 34 sort(edge,edge+id,cmp); 35 int num=0; 36 for(int i=0;i<id;i++) { 37 if(find(kind[edge[i].u])==find(kind[edge[i].v])) continue; 38 Union(kind[edge[i].u],kind[edge[i].v]); 39 ans+=edge[i].c; 40 if(++num==k-1) break; 41 } 42 if(num==k-1) printf("%lld",ans); 43 else printf("-1"); 44 return 0; 45 }

牛客寒假算法基礎集訓營4 G Applese 的毒氣炸彈