题目http://acm.hdu.edu.cn/showproblem.php?pid=1879

复习一下最小生成树的两个基本算法。

由于存在道路是否已修建的问题,如果已修建,那么该条道路的成本即为0.

首先复习一下kruskal,它的思路主要是既然有那么多边,那么多权值(这里即为成本),要求全连通后最小的权值,那么就将权值排序,先从最小的权值看起,

将该权值的对应的两点用并查集合并到一个集合里,然后依次按照权值从小到大的顺序比较下去,如果该权值对应的两点的祖先结点相同,证明这两点已经

连通,如果祖先结点不同,那么证明不在同一个集合里,这两点没连通,那么连通这两点(合并并查集),加上该权值~~。

 #include<cstdio>
#include<algorithm>
using namespace std;
#define M 5005
int father[M],r[M];
int a[M],b[M],c[M],d[M];
bool cmp(int i,int j) {return c[i]<c[j];}
int find(int x){
if (x==father[x]) return x;
father[x]=find(father[x]);
return father[x];
}
int kruska(int n){
int i,ans=;
for (i=;i<=n;i++) father[i]=r[i]=i;
sort(r+,r+n+,cmp);、//看懂这个排序,将数组r以数组c从小到大的顺序排,其实就是个结构体
for (i=;i<=n;i++){
int e=r[i];
int sx=find(a[e]);
int sy=find(b[e]);
if (sx!=sy){
ans+=c[e];father[sx]=sy;
}
}
return ans;
}
int main()
{
int n,i;
while (~scanf("%d",&n)&&n){
for (i=;i<=n*(n-)/;i++){
scanf("%d %d %d %d",&a[i],&b[i],&c[i],&d[i]);
if (d[i]) c[i]=;
}
printf("%d\n",kruska(n*(n-)/));
}
return ;
}

然后是prime,它是从某个顶点开始将它加入一个集合中,然后将集合内的顶点与集合外的顶点所构成的所有边中选取权值最小的一条边作为生成树的边,

并将集合外的那个顶点加入到集合中,表示该顶点已连通,然后再用集合内的顶点与集合外的顶点构成的边中找最小的边,并将相应的顶点加入集合中,这样下去直到全部顶点都加入到集合中,

即得最小生成树.

 #include<cstdio>
#include<cstring>
using namespace std;
#define M 5005
#define inf 0x3f3f3f3f
int a[M],b[M],c[M],d[M];
int dis[],vis[],mapp[][];
int prime(int n){
int ans=,i,j;
for (i=;i<=n;i++) dis[i]=mapp[][i];
memset(vis,,sizeof(vis));
vis[]=;
for (i=;i<n;i++){
int temp=inf,pos;
for (j=;j<=n;j++){//dis数组表示集合内与集合外的点的最小权值,
if (!vis[j]&&temp>dis[j])
pos=j,temp=dis[j];
}
ans+=dis[pos];
vis[pos]=;
for (j=;j<=n;j++){
if (!vis[j]&&dis[j]>mapp[pos][j])、、更新一遍dis
dis[j]=mapp[pos][j];
}
}
return ans;
}
int main()
{
int n,i,j;
while (~scanf("%d",&n)&&n){
for (i=;i<=n;i++)
for (j=;j<=n;j++)
mapp[i][j]=inf;
for (i=;i<=n*(n-)/;i++){
scanf("%d %d %d %d",&a[i],&b[i],&c[i],&d[i]);
if (d[i]) c[i]=;
mapp[a[i]][b[i]]=mapp[b[i]][a[i]]=c[i];
}
printf("%d\n",prime(n));
}
return ;
}

hdu (kruska and prime) 继续畅通工程的更多相关文章

  1. Kruskal算法(题目还是:畅通工程)

    那还是先把题目丢出来,是HDU上的一道题 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  2. HDU 1233.还是畅通工程-最小生成树(Prime)

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  3. ACM: HDU 1874 畅通工程续-Dijkstra算法

    HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Desc ...

  4. HDU 1875 畅通工程再续 (prim最小生成树)

    B - 畅通工程再续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit S ...

  5. hdu 1874 畅通工程续

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过 ...

  6. hdu 1874 畅通工程续 Dijkstra

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目分析:输入起点和终点,顶点的个数,已连通的边. 输出起点到终点的最短路径,若不存在,输出-1 ...

  7. hdu 1879 继续畅通工程

    /************************************************************************/ /* hdu 1879 继续畅通工程 Time L ...

  8. HDU 畅通工程系列

    畅通工程系列都是比较裸的最小生成树问题,且是中文题目,不赘述了. 1.HDU 1863 畅通工程 题意:一个省有很多村庄,其中一些之间是可以建公路的,每条公路都需要不同的代价,问代价最小的情况下将所有 ...

  9. HDU 1232(畅通工程)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定一具有N个节点的图和其边集,求其集合数量. [题目分析] 并查集经典题...其实就是创建好并查集就行了.. [算法流程] 于 ...

随机推荐

  1. C# Excel To DataTable

    原地址忘了 需引用NPOI,引用方法:项目引用那儿右键 => 管理NuGet程序包 => 游览 =>输入NPOI =>选中NPOI后安装(一般是第一个) /// <sum ...

  2. 吴裕雄 oracle PL/SQL编程

  3. 吴裕雄 22-MySQL 事务

    MySQL 事务MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据 ...

  4. 学JS的心路历程 -物件与原型(二)

    昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...

  5. OCR技术浅探(转)

    网址:https://spaces.ac.cn/archives/3785 OCR技术浅探 作为OCR系统的第一步,特征提取是希望找出图像中候选的文字区域特征,以便我们在第二步进行文字定位和第三步进行 ...

  6. ETL工具总结

    ETL的考虑        做 数据仓库系统,ETL是关键的一环.说大了,ETL是数据整合解决方案,说小了,就是倒数据的工具.回忆一下工作这么些年来,处理数据迁移.转换的工作倒 还真的不少.但是那些工 ...

  7. android Zxing 扫描区域的大小设置和自定义扫描view

    自己的项目中,只需要修改: CameraManager 里面的 MAX_FRAME_WIDTH .MAX_FRAME_HEIGHT 的值 private static final int MIN_FR ...

  8. 1.3.8、CDH 搭建Hadoop在安装之前(端口---Apache Flume和Apache Solr使用的端口)

    Apache Flume和Apache Solr使用的端口 Apache Flume用于与Apache Solr通信的端口可能会有所不同,具体取决于您的配置以及是否使用安全性(例如,SSL).使用Fl ...

  9. 1.1、CDH 搭建Hadoop在安装之前(配置网络名称)

    重要: CDH需要IPv4.不支持IPv6.提示:粘合时,请使用bond0 IP地址,因为它代表所有聚合链接. 按如下方式配置群集中的每个主机,以确保所有成员可以相互通信: 将主机名设置为唯一名称(不 ...

  10. 三层和MVC

    一样写啊... 比如DAL层: C# code? 1 2 3 4 5 Public void Update(XXXXX.Models.News model) {         db.Entry(XX ...