题解报告:hdu 1233 还是畅通工程
当N为0时,输入结束,该用例不被处理。
Huge input, scanf is recommended.
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = ;
int n,a,b,c,mincost[maxn],cost[maxn][maxn];
bool vis[maxn];
int Prim(){//加点法
for(int i=;i<=n;++i)//这里选取节点1作为起点,mincost为各节点到最小生成树节点集合的最小权值
mincost[i]=cost[][i];
mincost[]=;vis[]=true;//标记已访问
int res=;//计算最小生成树的权值
for(int i=;i<n;++i){
int k=-;//标记为-1
for(int j=;j<=n;++j)//找出到最小生成树节点集合的权值最小的还没入集合的一点
if(!vis[j] && (k==- || mincost[k]>mincost[j]))k=j;
if(k==-)break;//如果还是-1,表示已经完成最小生成树的建立
vis[k]=true;//将节点k纳入最小生成树节点的集合
res+=mincost[k];//加上其权值
for(int j=;j<=n;++j)//更新k的邻接点到最小生成树节点集合的最小权值
if(!vis[j])mincost[j]=min(mincost[j],cost[k][j]);//还没归纳的节点
}
return res;
}
int main()
{
while(~scanf("%d",&n) && n){
memset(vis,false,sizeof(vis));
for(int i=;i<=n;++i){
for(int j=;j<=n;++j)
cost[i][j]=(i==j?:INF);
}
for(int i=;i<=n*(n-)/;++i){
cin>>a>>b>>c;
cost[a][b]=cost[b][a]=c;
}
printf("%d\n",Prim());
}
return ;
}
AC代码之Kruskal算法:
#include<bits/stdc++.h>
using namespace std;
int n,father[],height[];
struct edge{int u,v,cost;}es[];
bool cmp(const edge& e1,const edge& e2){
return e1.cost<e2.cost;
}
void init_union_find(){//将每个节点当作根节点
for(int i=;i<=n;++i)father[i]=i;
}
int find_father(int x){//递归查找根节点
if(father[x]==x)return x;
else return father[x]=find_father(father[x]);
}
bool same_father(int x,int y){//查找两点的根节点是否相同
return find_father(x)==find_father(y);
}
void unite(int x,int y){
x=find_father(x);
y=find_father(y);
if(x==y)return;//如果为同一个连通图,直接返回
if(height[x]<height[y])father[x]=y;//高度大的当作高度小的父亲
else{
father[y]=x;
if(height[x]==height[y])height[x]++;//如果合并前两棵树的高度相等,加入一节点后树的高度就加1
}
}
int Kruskal(){
sort(es+,es+n*(n-)/+,cmp);//权值按从小到大排序
init_union_find();//并查集的初始化
int res=;
for(int i=;i<=n*(n-)/;++i){
edge e=es[i];
if(!same_father(e.u,e.v)){//如果两点的根节点不同,即为非连通图
unite(e.u,e.v);//归并到同一个集合
res+=e.cost;//加入权值
}
}
return res;
}
int main()
{
while(~scanf("%d",&n) && n){
for(int i=;i<=n*(n-)/;++i)
scanf("%d %d %d",&es[i].u,&es[i].v,&es[i].cost);
memset(height,,sizeof(height));//初始化树的高度为0
printf("%d\n",Kruskal());
}
return ;
}
克鲁斯卡尔简化版代码:
#include<bits/stdc++.h>
using namespace std;
int n,father[],sum;
struct edge{int u,v,cost;}es[];
bool cmp(const edge& e1,const edge& e2){
return e1.cost<e2.cost;
}
void init_union_find(){//将每个节点当作根节点
for(int i=;i<=n;++i)father[i]=i;
}
int find_father(int x){//递归查找根节点
if(father[x]==x)return x;
else return father[x]=find_father(father[x]);
}
void unite(int x,int y,int z){
x=find_father(x);
y=find_father(y);
if(x!=y){//如果边的两端点的根节点不相同,即分别为非连通图,则可以归并
sum+=z;//加上最小权值
father[x]=y;//将x的父节点改成y,也就是现在x的根节点是y的根节点,注意这里只是简单的修改,和上面归纳到同一个集合不太一样
}
}
int main()
{
while(~scanf("%d",&n) && n){
for(int i=;i<=n*(n-)/;++i)
scanf("%d %d %d",&es[i].u,&es[i].v,&es[i].cost);
sort(es+,es+n*(n-)/+,cmp);//权值按从小到大排序
sum=;init_union_find();//初始化
for(int i=;i<=n*(n-)/;++i)
unite(es[i].u,es[i].v,es[i].cost);
printf("%d\n",sum);
}
return ;
}
题解报告:hdu 1233 还是畅通工程的更多相关文章
- HDU.1233 还是畅通工程(Prim)
HDU.1233 还是畅通工程(Prim) 题意分析 首先给出n,代表村庄的个数 然后出n*(n-1)/2个信息,每个信息包括村庄的起点,终点,距离, 要求求出最小生成树的权值之和. 注意村庄的编号从 ...
- HDU 1233 还是畅通工程(Kruskal算法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1233 还是畅通工程 (最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1233 - 还是畅通工程(MST)
还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU 1233 还是畅通工程 (最小生成树 )
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路 ...
- HDU 1233 还是畅通工程(最小生成树)
传送门 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 1233 还是畅通工程 (最小生成树)
还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu 1233 还是畅通工程 并查集or最小生成树
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路 ...
- hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)
还是畅通工程 Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
随机推荐
- Docker学习总结(17)——学会使用Dockerfile
Docker.Dockerfile.Docker镜像.容器这些都是什么鸟? 老生常谈,再再再--普及一下: Docker: 最早是dotCloud公司出品的一套容器管理工具,但后来Docker慢慢火起 ...
- Ural 1036 Lucky Tickets
Lucky Tickets Time Limit: 2000ms Memory Limit: 16384KB This problem will be judged on Ural. Original ...
- HDU 1274 递归拼接字符串
题目大意: 根据所给的数字,表示其相连的字符的输出个数,或是下一个括号中的所有字符的输出个数 每一个相互对应的 '(' 和 ')' 中的所有字母均作为一组数据处理 在每一次dfs过程中都处理好这样一个 ...
- [51Nod1089] 最长回文子串 V2(Manacher算法)
1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 回文串是指aba.abba.cccbccc.aaaa这种左右对称 ...
- 170611 NOIP模拟赛
第一题没做出来不应该: 第二题不难想,就是写起来很麻烦: 第三题因为学了挺久的splay就直接写的splay,没太在意常数问题,一般情况下,第k值问题主席树是比splay稍快的: 盘子序列 [题目描述 ...
- 交友app
编辑注记:这是由译者 han_qi 翻译纽约客的一篇文章,从女性的角度描写了交友产品的用户体验及需求,值得广大产品经理深入研究,文章略长,但值得深读.原文<Overwhelmed and Cre ...
- 初识iBatis
在JAVA EE应用程序中,持久层框架常用的有:Hibernate和IBATIS(或MyBatis),Hibernate是全自动的,IBatis是半自动的. IBatis的主要的作用是把SQL语句从我 ...
- Spring MVC 4实现RESTFul WebServices的CRUD实例和使用RestTemplate进行请求(全注解形式配置Web和Filter)
在这篇文章中,我们将使用Spring4 MVC编写一个CRUD RESTful Web服务,写一个REST客户端RestTemplate来使用这些服务.我们也将利用外部客户端测试的服务. 下面将展示核 ...
- jq超简单的流式布局,代码简单,容易修改
1.看看效果吧! 2.html代码index.html <!DOCTYPE html> <html lang="en"> <head> < ...
- MySQL: 打开binlog选项后无法重启MySQL
binlog目录权限不足导致,用chown mysql:mysql <log folder>即可解决此问题.