hdu (kruska and prime) 继续畅通工程
题目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) 继续畅通工程的更多相关文章
- Kruskal算法(题目还是:畅通工程)
那还是先把题目丢出来,是HDU上的一道题 畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- HDU 1233.还是畅通工程-最小生成树(Prime)
还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- ACM: HDU 1874 畅通工程续-Dijkstra算法
HDU 1874 畅通工程续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Desc ...
- HDU 1875 畅通工程再续 (prim最小生成树)
B - 畅通工程再续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit S ...
- hdu 1874 畅通工程续
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过 ...
- hdu 1874 畅通工程续 Dijkstra
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目分析:输入起点和终点,顶点的个数,已连通的边. 输出起点到终点的最短路径,若不存在,输出-1 ...
- hdu 1879 继续畅通工程
/************************************************************************/ /* hdu 1879 继续畅通工程 Time L ...
- HDU 畅通工程系列
畅通工程系列都是比较裸的最小生成树问题,且是中文题目,不赘述了. 1.HDU 1863 畅通工程 题意:一个省有很多村庄,其中一些之间是可以建公路的,每条公路都需要不同的代价,问代价最小的情况下将所有 ...
- HDU 1232(畅通工程)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定一具有N个节点的图和其边集,求其集合数量. [题目分析] 并查集经典题...其实就是创建好并查集就行了.. [算法流程] 于 ...
随机推荐
- ztree根据treeId展开指定节点并触发单击事件
ztree.expandNode(ztree.getNodeByParam("id",treeId,null));//展开指定节点 ztree.selectNode(ztree.g ...
- spring boot 集成Thymeleaf
- 学习JS的心路历程-参数的传递(下)
今天我们要来探讨JS到底是透过何种参数传递方式呢? 废话不多说,上示例!! 我们先声明原始型别和物件型别来看看两者是否会有不一样的差异: var myStr = 'Hola': var myObj = ...
- hive 解jason字符串
json 字符串为: 字段名为: json {"appId":36222,"deviceId":"12536521-7b3d-41f6-9c09-fd ...
- kotlin函数api
原 Kotlin学习(4)Lambda 2017年09月26日 21:00:03 gwt0425 阅读数:551 记住Lambda的本质,还是一个对象.和JS,Python等不同的是,Kotlin ...
- K-means算法的实现
K-MEANS算法是一种经典的聚类算法,在模式识别得到了广泛的应用.算法中有两个关键问题需要考虑:一是如何评价对象的相似性,通常用距离来度量,距离越近越相似:另外一个是如何评价聚类的效果,通常采用误差 ...
- openlayers/// Puppeteer.js
1.定位;https://viglino.github.io/ol3-ext/examples/map.interaction.geolocationdraw.html 2 .添加Overlay d ...
- webpack-manifest-plugin
[webpack-manifest-plugin] Webpack plugin for generating an asset manifest. This will generate a mani ...
- SpringCloud报错: "Field discoveryClient in com.controller.DcController required a bean of type 'com.netflix.discovery.DiscoveryClient' that could not be found."
SpringCloud报错: "Field discoveryClient in com.controller.DcController required a bean of type 'c ...
- vue使用全局element-ui组件
安装loader模块: cnpm install style-loader -D cnpm install css-loader -D cnpm install file-loader -D 安装 ...