最小生成树算法简单

只是增加了一些新的东西,对于需要最小生成树算法 和中 并检查使用的一系列 还有一些更深入的了解。

方法的一些复杂问题

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 1005; struct point
{
int x;
int y;
}pp[maxn];
struct edge
{
int s;
int e;
int dist;
}l[maxn*maxn];
int n,q,m;
int p[maxn];
vector<int> g[10];
int c[10];
int distance_(point a,point b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int cmp(edge a,edge b)
{
return a.dist < b.dist;
}
int find_(int x)
{
return p[x]==x?x:p[x]=find_(p[x]);
}
bool merge_(int a,int b)
{
int x=find_(a);
int y=find_(b);
if(x==y) return false;
p[x]=y;
return true;
}
int kruskal()
{
int ans=0;
int num=0;
for(int i=0;i<m&&num<n-1;i++)
{
if(merge_(l[i].s,l[i].e))
{
num++;
ans+=l[i].dist;
}
}
return ans;
}
void solve()
{
for(int i=0;i<=n;i++) p[i]=i;
int ans = kruskal();
for(int s=1;s<(1<<q);s++)
{
int cost=0;
for(int tt=0;tt<=n;tt++) p[tt]=tt;
for(int j=0;j<q;j++)
{
if(!((s>>j)&1)) continue;
cost+=c[j];
for(int k=0;k<g[j].size();k++)
{
merge_(g[j][k],g[j][0]);
}
}
ans=min(ans,cost+kruskal());
}
printf("%d\n",ans);
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&q);
for(int i=0;i<10;i++) g[i].clear();
for(int i=0;i<q;i++)
{
int cnt;
scanf("%d%d",&cnt,&c[i]);
int a;
for(int j=0;j<cnt;j++)
{
scanf("%d",&a);
g[i].push_back(a);
}
}
for(int i=1;i<=n;i++)
{
scanf("%d%d",&pp[i].x,&pp[i].y);
}
m=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
l[m].s=i;
l[m].e=j;
l[m++].dist=distance_(pp[i],pp[j]);
}
}
sort(l,l+m,cmp);
solve();
if(t) printf("\n");
}
return 0;
}

鉴于需要使用几个选项 枚举子 算法。

在上面的解决方法。它使用的二进制计数的方法的帮助的一个子集。枚举算法的子集只适用于相对小的一组元素的。

采取结构上述表示的方法edge该方法,与其说开放数组。我觉得跟结构可以更可读的代码。

uva 1151 - Buy or Build poj 2784 Buy or Build(最小生成树)的更多相关文章

  1. POJ(2784)Buy or Build

    Buy or Build Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1369   Accepted: 542 Descr ...

  2. Poj(2784),二进制枚举最小生成树

    题目链接:http://poj.org/problem?id=2784 Buy or Build Time Limit: 2000MS   Memory Limit: 65536K Total Sub ...

  3. Buy or Build (poj 2784 最小生成树)

    Buy or Build Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1348   Accepted: 533 Descr ...

  4. UVA 1151 Buy or Build MST(最小生成树)

    题意: 在平面上有n个点,要让所有n个点都连通,所以你要构造一些边来连通他们,连通的费用等于两个端点的欧几里得距离的平方.另外还有q个套餐,可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相 ...

  5. UVA 1151 Buy or Build (最小生成树)

    先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点.正确性是基于一个贪心, 在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少. ...

  6. POJ 2828 Buy Tickets(排队问题,线段树应用)

    POJ 2828 Buy Tickets(排队问题,线段树应用) ACM 题目地址:POJ 2828 Buy Tickets 题意:  排队买票时候插队.  给出一些数对,分别代表某个人的想要插入的位 ...

  7. poj 2828 Buy Tickets(树状数组 | 线段树)

    题目链接:poj 2828 Buy Tickets 题目大意:给定N,表示有个人,给定每一个人站入的位置,以及这个人的权值,如今按队列的顺序输出每一个人的权值. 解题思路:第K大元素,非常巧妙,将人入 ...

  8. poj 2828 Buy Tickets 【线段树点更新】

    题目:id=2828" target="_blank">poj 2828 Buy Tickets 题意:有n个人排队,每一个人有一个价值和要插的位置,然后当要插的位 ...

  9. 线段树(单点更新) POJ 2828 Buy tickets

    题目传送门 /* 结点存储下面有几个空位 每次从根结点往下找找到该插入的位置, 同时更新每个节点的值 */ #include <cstdio> #define lson l, m, rt ...

随机推荐

  1. Multiple bindings were found on the class path(转)

    Multiple bindings were found on the class path SLF4J API is designed to bind with one and only one u ...

  2. C# - 委托_ 匿名方法

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  3. linux工具:ssh---未完

    ssh server_ip 或者 ssh username@server_ip 或者 ssh username@server_name , 再按提示输入密码. ____________________ ...

  4. Apache Flink

    Flink 剖析 1.概述 在如今数据爆炸的时代,企业的数据量与日俱增,大数据产品层出不穷.今天给大家分享一款产品—— Apache Flink,目前,已是 Apache 顶级项目之一.那么,接下来, ...

  5. c:foreach如何嵌套循环,求指教,求优化

    java类: public class PopedomItem { private String id; private String pid; private String name; privat ...

  6. Android 调整屏幕分辩率

    Android 可设置为随着窗口大小调整缩放比例及设定fixed的窗口大小. 对于surface的控制在SurfaceHolder类中进行 而Android 屏幕分辩率中已经有一个类DisplayMe ...

  7. Swift - 使用CATransition制作过渡动画(页面切换转场效果)

    CATransition动画主要在过渡时使用,比如两个页面层级改变的时候添加一个转场效果.CATransition分为两类,一类是公开的动画效果,一类是非公开的动画效果. 1,公开动画效果: kCAT ...

  8. 事务管理在三层架构中应用以及使用ThreadLocal再次重构

    本篇将详细讲解如何正确地在实际开发中编写事务处理操作,以及在事务处理的过程中使用ThreadLocal的方法. 在前面两篇博客中已经详细地介绍和学习了DbUtils这个Apache的工具类,那么在本篇 ...

  9. Delphi - 闲来无事,自己写个Timer玩玩(多线程Timer)

    明天去坐火车,回家,今天就没有事做,本来在弄一个跨进程获取其他程序里面组件,如ListView,ListBox,Button等的信息,突然有个想法自己写个Timer,不用SetTimer函数,我们自己 ...

  10. 基于Greenplum Hadoop分布式平台的大数据解决方案及商业应用案例剖析

    随着云计算.大数据迅速发展,亟需用hadoop解决大数据量高并发访问的瓶颈.谷歌.淘宝.百度.京东等底层都应用hadoop.越来越多的企 业急需引入hadoop技术人才.由于掌握Hadoop技术的开发 ...