zoukankan      html  css  js  c++  java
  • VIJOS-P1234 口袋的天空

    洛谷 P1195 口袋的天空

    https://www.luogu.org/problemnew/show/P1195

    JDOJ 1374: VIJOS-P1234 口袋的天空

    https://neooj.com:8082/oldoj/problem.php?id=1374

    (我还是喜欢洛谷的题面,吉大的题面太冷血)

    题目背景

    小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。

    有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。

    题目描述

    给你云朵的个数NN,再给你MM个关系,表示哪些云朵可以连在一起。

    现在小杉要把所有云朵连成KK个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。

    输入输出格式

    输入格式:

    每组测试数据的

    第一行有三个数N,M,K(1 le N le 1000,1 le M le 10000,1 le K le 10)N,M,K(1N1000,1M10000,1K10)

    接下来MM个数每行三个数X,Y,LX,Y,L,表示XX云和YY云可以通过LL的代价连在一起。(1 le X,Y le N,0 le L<10000)(1X,YN,0L<10000)

    30\%30%的数据N le 100,M le 1000N100,M1000

    输出格式:

    对每组数据输出一行,仅有一个整数,表示最小的代价。

    如果怎么连都连不出KK个棉花糖,请输出'No Answer'。

    输入输出样例

    输入样例#1: 复制
    3 1 2
    1 2 1
    
    输出样例#1: 复制
    1

    说明

    厦门一中YMS原创

    我们知道,kruskal算法的生成树需要加计数器,cnt==n-1的时候break掉。

    是的,这是一条基本定理,有n个节点,n-1条边的图是一棵树。那么以此类推,一棵树连n-1条边,假如我们再减少一条边,就势必会把已经连好的树切断,最不理想情况就是切断叶子节点的入边,也会生成一棵只有根节点的树,也就是说,n-2条边链接成2棵树。。。

    以此类推...

    假如我们需要k棵树,就得连n-k条边。

    所以我们就得到了这题的题目大意:

    给定一张无向图,求k个最小生成树,输出最小边权和。

    kruskal算法简单易懂,搞定。

    CODE:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,m,k,cnt,ans;
    int fa[1001];
    struct edge
    {
        int x,y,z;
    }e[100001];
    bool cmp(edge a,edge b)
    {
        return a.z<b.z;
    }
    int find(int x)
    {
        if(fa[x]==x)
            return x;
        return fa[x]=find(fa[x]);
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=m;i++)
            scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
        sort(e+1,e+m+1,cmp);
        for(int i=1;i<=n;i++)
            fa[i]=i;
        for(int i=1;i<=m;i++)
        {
            int fx=find(e[i].x);
            int fy=find(e[i].y);
            if(fx!=fy)
            {
                fa[fx]=fy;
                cnt++;
                ans+=e[i].z;
            }
            if(cnt==n-k)
            {
                printf("%d",ans);
                return 0;
            }
        }
        return 0;
    }

    这份代码我根本忘记输出NO ANSWER了,竟然也过了,汗颜。

    补充完整:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,m,k,cnt,ans;
    int fa[1001];
    struct edge
    {
        int x,y,z;
    }e[100001];
    bool cmp(edge a,edge b)
    {
        return a.z<b.z;
    }
    int find(int x)
    {
        if(fa[x]==x)
            return x;
        return fa[x]=find(fa[x]);
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=m;i++)
            scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
        sort(e+1,e+m+1,cmp);
        for(int i=1;i<=n;i++)
            fa[i]=i;
        for(int i=1;i<=m;i++)
        {
            int fx=find(e[i].x);
            int fy=find(e[i].y);
            if(fx!=fy)
            {
                fa[fx]=fy;
                cnt++;
                ans+=e[i].z;
            }
            if(cnt==n-k)
            {
                printf("%d",ans);
                return 0;
            }
        }
        printf("No Answer");
        return 0;
    }
  • 相关阅读:
    stm32之波特率、USART
    C语言排序
    【要经常更新】C语言一些题目
    jquery瀑布流布局插件,兼容ie6不支持下拉加载,用于制作分类卡
    jquery等待图片加载完成,再使用函数,使用$(window).load(fn)
    ie6中 object doesn’t support this property or method
    jquery插件中参数未填写错误,火狐不会显示和报错,ie会显示
    flash插件使用外部数据的方法
    织梦在广告(myad)中使用css样式
    织梦改变模板目录
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11217308.html
Copyright © 2011-2022 走看看