1195口袋
Posted liumengliang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1195口袋相关的知识,希望对你有一定的参考价值。
这是一道贪心题目,贪心的思路就是将代价从小到大排序,然后不断选取最小的代价(需要满足此关系的两朵云彩没有联通,否则直接跳过选下一个)。
满足此关系的两朵云彩是否联通可以用并查集来处理。
代码:
c:
#include<stdio.h> struct node{ int a,b,p;//a,b连接的云朵,p代价 }a[10001]; int n,m,k,b[1001]; long long ad=0; int px(int l,int r){//排序 int i,j;struct node mid,p; i=l;j=r; mid=a[(l+r)/2]; do{ while(a[i].p<mid.p)i++; while(a[j].p>mid.p)j--; if(i<=j){ p=a[i];a[i]=a[j];a[j]=p; i++;j--; } }while(i<=j); if(i<r)px(i,r); if(l<j)px(l,j); return 0; } int find(int p){//寻找根节点 return b[p]==p?p:(b[p]=find(b[p])); } int main(){ scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++)scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].p); px(1,m);int a1,b1; int now=0; for(int i=1;i<=n;i++)b[i]=i;//初始化让每个数根节点是他自己 for(int i=1;i<=n-k;i++){ now++; if(now>m){printf("No Answer");return 0;}//如果把所有的都搜完了还没有连出k个则输出No Answer a1=find(a[now].a); b1=find(a[now].b); if(a1!=b1){b[b1]=a1;ad=ad+a[now].p;}//将b1接到a1上 else i--;//跳过它直接搜下一个 } printf("%lld",ad); return 0; }
以上是关于1195口袋的主要内容,如果未能解决你的问题,请参考以下文章