题解报告: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 ...
随机推荐
- Wind rotor states
test test Table of Contents 1. Wind rotor states 1.1. Turbulent Wake State 1.2. Vortex Ring State 1. ...
- 【DIP, OpenCV】Some Kinds Of Image Smoothing Methodologies
In digital image processing(DIP), many methods are used in smoothing images in order to suppress noi ...
- 封装的一些常见的JS DOM操作和数据处理的函数.
//用 class 获取元素 function getElementsByClass(className,context) { context = context || document; if(do ...
- poj 1659 判断是否能构成图Havel-Hakimi定理
//用到了Havel-Hakimi定理,判断是否能够构图 //两种情况不能构图,1:对剩下序列排序后,最大的度数超过了剩下的顶点数 // 2:对最大的度数后面的f个度数减-后,出现了负数 //记录到临 ...
- 仪仗队(codevs 2296)
题目描述 Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来 ...
- jconsole远程连接 jmx配置注意事项
由于在测试程序时需要收集程序运行时的内存,CPU等消耗情况.选择了jconsole这个jdk自带工具来观察.为了不影响程序运行状态,用远程连接的方式来具体观察. 首先,程序是放在ubutun系统服务器 ...
- one troubleshooting case about em access issue
Today when trying to open my Oracle EM url, I can not open it. So I thought may be the network is ha ...
- uva 11552 dp
UVA 11552 - Fewest Flops 一个字符串,字符串每 k 个当作一组,组中的字符顺序能够重组.问经过重组后改字符串能够编程最少由多少块字符组成.连续的一段字符被称为块. dp[i][ ...
- 从尾到头打印链表——剑指Offer
https://www.nowcoder.net/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tqId=11156&tPage= ...
- BC #62 div1 02
/* 数位DP题,设dp[n][k][j]为前n位最后一位是k时mod为j的个数.操作都相同,可以使用矩阵加速.本来对于每一位是7*10,可以把它压向一个向量. 加速矩阵为70*70,再加一维计算前缀 ...