题解报告: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 ...
随机推荐
- 第十节:Web爬虫之数据存储与MySQL8.0数据库安装和数据插入
用解析器解析出数据之后,接下来就是存储数据了,保存的形式可以多种多样,最简单的形式是直接保存为文本文件,如 TXT.JSON.csv 另外,还可以保存到数据库中,如关系型数据库MySQL ,非关系型数 ...
- vue 刷新当前页面的时候重新调用新的cookie
data() { return{ AdminToken: this.getCookie('token'), } }, updated() { //刷新当前页面的时候重新调用新的cookie this. ...
- js 发布订阅模式
//发布订阅模式 class EventEmiter{ constructor(){ //维护一个对象 this._events={ } } on(eventName,callback){ if( t ...
- 什么是Spring Boot简介
1.什么是spring boot 简单的说,spring boot就是整合了很多优秀的框架,不用我们自己手动的去写一堆xml配置然后进行配置. 从本质上来说,Spring Boot就是Spring,它 ...
- Linux运行级别研究(转)
Linux系统中的运行级别 7种运行级别 运行级别(Runlevel)指的是Unix或者Linux等类Unix操作系统的运行模式,不同的运行模式下系统的功能也有所有不同.Linux 系统下通常分为7种 ...
- Nginx 重写规则指南
作者:运维生存时间 - 默北 链接:www.ttlsa.com/nginx/nginx-rewriting-rules-guide/ 当运维遇到要重写情况时,往往是要程序员把重写规则写好后,发给你,你 ...
- Visual Studio 中的 .NET Framework 类库
Visual Studio 中的 .NET Framework 类库 .NET Framework 类库由命名空间组成.每个命名空间都包含可在程序中使用的类型:类.结构.枚举.委托和接口. 当您在 V ...
- mysql Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’
mysql Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ 今天在linux中安装了mys ...
- linux下让irb实现代码自己主动补全的功能
我不知道其它系统上irb是否有此功能,可是在ubuntu上ruby2.1.2自带的irb默认是没有代码自己主动补全功能的,这多少让人认为有所不便.事实上加上也非常easy,就是在irb里载入一个模块: ...
- 递归删除目录下.svn文件
原文:http://imysqldba.blog.51cto.com/1222376/1104901 ------------------------------------------------- ...