码迷,mamicode.com
首页 > 其他好文 > 详细

1195口袋

时间:2020-04-19 10:44:20      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:copy   struct   图片   gif   for   amp   clu   输出   否则   

这是一道贪心题目,贪心的思路就是将代价从小到大排序,然后不断选取最小的代价(需要满足此关系的两朵云彩没有联通,否则直接跳过选下一个)。

满足此关系的两朵云彩是否联通可以用并查集来处理。

代码:

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口袋

标签:copy   struct   图片   gif   for   amp   clu   输出   否则   

原文地址:https://www.cnblogs.com/liumengliang/p/12730394.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!