关闭

TJU-4117 Happy tree friends(最小生成树)

标签: acmhdojkruskal
291人阅读 评论(0) 收藏 举报
分类:

题目貌似出的有点问题,考试的时候理解有点偏差。题干里说的是无向边,然而样例里Wij != Wji。晕了。以为是最小树形图。

最后和AC同学打听了一下,直接按无向边做就好了,其余的不用管。还有一定要加的那个边的方向不要边。

剩下就是标准的kruskal算法了。先把边按升序排序,再利用并查集向一个集合里加。如果没有冲突(要加的边的两点还没有再一个集合里,那么把这条边的两点相连,权值加入答案)。处理必须要加入的边,先把它的权值加入答案,再把这条边的权值修改为0,排序后,这条边一定会被选中。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=10010;

int n,m,f[N];
struct edge
{
    int x,y;
    int w;
}e[N];

bool cmp(const edge a,const edge b)
{
    return a.w<b.w;
}

int root(int x)
{
    if(f[x]==x) return x;
    f[x]=root(f[x]);
    return f[x];
}

void work()
{
    int i,j,k,t,sum,ans;
    int u,v;

    sum=0;
    m=0;
    memset(e,0,sizeof(e));
    for(i=0;i<=n;i++) f[i]=i;

    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
            scanf("%d",&e[m].w);
            e[m].x=i;
            e[m].y=j;
            if(i==j) e[m].w=100000000;
            m++;
        }
    scanf("%d%d",&u,&v);
    sum=e[(u-1)*n+v-1].w;
    e[(u-1)*n+v-1].w=0;
    sort(e,e+m,cmp);
    for(i=0;i<m;i++)
    {
        j=root(e[i].x);
        k=root(e[i].y);
        if(j!=k)
        {
            f[j]=k;
            sum+=e[i].w;
        }
    }

    printf("%d\n",sum);
}

int main()
{
    while(scanf("%d",&n)!=EOF)
        work();
    return 0;
}


0
0
查看评论

Happy Matt Friends(利用滚动数组优化数组空间的DP)

Link:http://acm.hdu.edu.cn/showproblem.php?pid=5119 Happy Matt Friends Time Limit: 6000/6000 MS (Java/Others)    Mem...
  • Enjoying_Science
  • Enjoying_Science
  • 2015-10-16 23:48
  • 521

HDU - 5119 Happy Matt Friends(DP)

题目大意:给你N个数,问有多少个子集,满足子集内所有数的xor和大于等于M解题思路:用dp[i][j]表示前i个数,xor和为j的情况有多少种 则dp[i][j] = dp[i - 1][j],表示第i个数不选 dp[i][j ^ val[i]] += dp[i][j],表示选了第i个数#inc...
  • L123012013048
  • L123012013048
  • 2015-10-28 23:25
  • 462

最小生成树 TOJ 4117 Happy tree friends

4117.   Happy tree friends Time Limit: 1.0 Seconds   Memory Limit: 65536K Total Runs: 164   Accepte...
  • basasuya
  • basasuya
  • 2015-07-07 20:09
  • 473

POJ_2773_Happy 2006_ 欧几里得算法

Happy 2006 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 10818 Accepted: 3760 Description Two positive integers are said to...
  • huangshuai147
  • huangshuai147
  • 2016-04-28 21:28
  • 666

TOJ 4117 Happy tree friends

It's a problem of minimum spanning tree,I think it a directed graph that have differences with undirected graph .But it's complete graph.It ...
  • NMfloat
  • NMfloat
  • 2015-07-08 15:35
  • 258

CodeForces 593D Happy Tree Party(树链剖分(边权) or LCA+并查集)

题意:给你一棵数,n个点n-1条边,每条边有个权值,q次询问,询问有两种: 1 a b y : a到b的路径上不断进行y = y/xi(像下取整),问最后y的值 2 p c :  将第p条边的权值改为c,c一定比原来这条边的值小 思路: 树剖:线段树记录区间的乘积,查询的时候当两者重链...
  • CillyB
  • CillyB
  • 2017-08-09 01:32
  • 243

codeforces 593 D. Happy Tree Party (LCA + 并查集)

D. Happy Tree Party time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard out...
  • whai362
  • whai362
  • 2015-11-05 20:30
  • 535

Codeforces Round #329 (Div. 2) D. Happy Tree Party

对于从a→ba\rightarrow b 的路径,如果边权值为11,则值不变,否则就是1≤边权值1\leq 边权值,这样的话最多除6464次就为00也就不需要继续除下去了,所以问题的关键在于去压缩哪些连续的边权为11的路径,这里自然就想到并查集啦,具体实现看代码吧! 另:因为更改后的边权值只会变...
  • u013007900
  • u013007900
  • 2015-11-06 19:48
  • 461

The minimum spanning tree of a graph(图的最小生成树)

Q: minimum spanning tree 的定义 A: 给定一幅图G = (V,E), 找到E的一个能够连接起G中所有的节点(vertices)的边子集T, 并且边子集的权重之和最小, 这就是我们所说的最小生成树。 由于T是无环的, 并且联通所有的节点, 所以T然是一棵树。 上图(g...
  • a130737
  • a130737
  • 2014-08-08 13:32
  • 807

说说最小生成树(Minimum Spanning Tree)

minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点、无环、路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者叫切断,会使图分离成为两个不相连的顶点集. 它基于树的两个基本属性: 为树的任意两个节...
  • gsky1986
  • gsky1986
  • 2015-04-20 14:24
  • 2435
    个人资料
    • 访问:30640次
    • 积分:1104
    • 等级:
    • 排名:千里之外
    • 原创:82篇
    • 转载:3篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论