组队赛第五场 组合隔板法+最小生成树预处理并查集

UVALive
6434

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4445

这题正好就是大一小学期的时候好像是曦曦出的那个牛那题吧,就是要买多少块板然后正好把牛给拦完。这题也是一样,就是找最大的距离,当做隔板,依次把最大的距离去掉,最后的就是最小的了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define llson j<<1,l,mid
#define rrson j<<1|1,mid+1,r
#define INF 0x7fffffff
#define maxn 1010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
    //freopen("test.txt","r",stdin);
    int t;
    scanf("%d",&t);
    for(int ii=1;ii<=t;ii++)
    {
        int n,m,i,sum=0,a[102];
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%d",a+i);
        sort(a,a+n);
        for(i=1;i<n;i++)
            a[i-1]=a[i]-a[i-1];
        sort(a,a+n-1);
        for(i=0;i<n-m;i++)
            sum+=a[i];
        printf("Case #%d: %d\n",ii,sum);
    }
    return 0;
}

UVALive
6437

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4448

这题刚开始我也没想好怎么做,因为找最小的,所以感觉和最小生成做有并。但是怎么有关的,想了好久,原来是预处理那里。先打发电站放进并查集里就行了,然后求出来的最小生成树肯定就是最小的啦。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define llson j<<1,l,mid
#define rrson j<<1|1,mid+1,r
#define INF 0x7fffffff
#define maxn 1010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
struct abc
{
    int u,v,w;
    bool operator<(const abc &a)const
    {
        return w<a.w;
    }
}a[40005];
int f[202],t,i,j,k,n,m,fa,power;
int find(int x)
{
    return x==f[x]?x:f[x]=find(f[x]);
}
int kruscal()
{
    sort(a,a+m);
    int sum=0;
    for(j=0;j<m;j++)
    {
        int x=find(a[j].u);
        int y=find(a[j].v);
        if(x!=y) sum+=a[j].w,f[y]=x;
    }
    return sum;
}
int main()
{
    //freopen("test.txt","r",stdin);
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {
        scanf("%d%d%d",&n,&m,&k);
        for(j=0;j<=n;j++)
            f[j]=j;
        scanf("%d",&fa);
        for(j=1;j<k;j++)
        {
            scanf("%d",&power);
            f[power]=fa;
        }
        for(j=0;j<m;j++)
            scanf("%d%d%d",&a[j].u,&a[j].v,&a[j].w);
        printf("Case #%d: %d\n",i,kruscal());
    }
    return 0;
}

组队赛第五场 组合隔板法+最小生成树预处理并查集

时间: 2024-10-14 23:16:24

组队赛第五场 组合隔板法+最小生成树预处理并查集的相关文章

SDUT 2933-人活着系列之Streetlights(最小生成树Kruskal+并查集实现)

人活着系列之Streetlights Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 人活着如果是为了家庭,亲情----可以说是在这个世界上最温暖人心的,也是最让人放不下的,也是我在思索这个问题最说服自己接受的答案.对,也许活着是一种责任,为了繁殖下一代,为了孝敬父母,男人要养家糊口,女人要生儿育女,就这样循环的过下去,但最终呢?还是劳苦愁烦,转眼成空呀! 为了响应政府节约能源的政策,某市要对路灯进行改革,已知该市有n个城镇,

HDU ACM 5253 连接的管道-&gt;最小生成树(并查集)

分析:并查集实现最小生成树.不能用cin和cout(使用了ios::sync_with_stdio(false);都不行),否则TLE. #include<iostream> #include<algorithm> #include<cmath> using namespace std; #define N 1005 int father[N*N]; struct EDGE { int u,v; int len; bool operator<(const EDGE

HDU1233——还是通常工程(最小生成树,并查集)

http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意:就是裸的最小生成树.这里用的是kruskal 使用的是并查集,将按距离排序的边,分别把点加到集合里.节点存在在集合里说明是环路. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,s,k; int par[10

模板(最短路,最小生成树,并查集)

单源最短路 #include<queue> #include<cstdio> #define INF 2147483647LL using namespace std; struct node { int to,dis,next; }; struct node edge[500005]; int n,m,num,head[10001],dis_1[10001]; inline void edge_add(int from,int to,int dis) { num++; edge[

最小生成树(kruskal+并查集)

最小生成树 最小生成树即用最少的边权将所有给定的点连在同一联通分量中,常用kruskal和prim算法 kruskal算法(适合稀疏图) 最小生成树的kruskal算法,稍带并查集的应用 int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); //不要漏了fa[x]=... } int kruskal() { int ans=0; for(int i=0;i<N;i++) fa[i]=i;//初始化并查集 sort(edge,edge+e);

线段树、最短路径、最小生成树、并查集、二分图匹配、最近公共祖先--C++模板

线段树(区间修改,区间和): #include <cstdio> #include <iostream> #include <cstring> using namespace std; int c[1000000],n,m; char s; void update(int p,int l,int r,int x,int add) { int m=(l+r) / 2; if (l==r) { c[p]+=add; return; } if (x<=m) update

最小生成树个数 并查集压缩路径

1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5843  Solved: 2379[Submit][Status][Discuss] Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的 最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的最小生 成树可能很多,所以你只需要输出方案数对3101

codevs 1078最小生成树 Kruskal+并查集

题目描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场.为了使花费最少,他想铺设最短的光纤去连接所有的农场. 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案. 每两个农场间的距离不会超过100000 输入描述 Input Description 第一行: 农场的个数,N(3<=N<=100).

UVA - 10004 Bicoloring(判断二分图——交叉染色法 / 带权并查集)

d.给定一个图,判断是不是二分图. s.可以交叉染色,就是二分图:否则,不是. 另外,此题中的图是强连通图,即任意两点可达,从而dfs方法从一个点出发就能遍历整个图了. 如果不能保证从一个点出发可以遍历整个图,那么编程要注意了,应该从每个点出发遍历一次. s2.带权并查集来判断,略复杂.先略过.先上个博客:http://blog.csdn.net/zsc09_leaf/article/details/6727622 c.邻接矩阵,bfs #include<iostream> #include&