题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 62608    Accepted Submission(s): 28422

Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
 
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
 
Output
对每个测试用例,在1行里输出最小的公路总长度。
 
Sample Input
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
 
Sample Output
3
5

Hint

Hint

Huge input, scanf is recommended.

 
Source
 
Recommend
JGShining   |   We have carefully selected several similar problems for you:  1232 1102 1875 1879 1301 
 
题目意思很简单,其实就是要我们求一个最小生成树
思路:prim算法和kruskal算法都行 任意一个都可以过
 
prim:
从 不属于本集合 的点中找到一个与本集合   直接相连的   离本集合最近的点
#include<iostream>
using namespace std;
const int maxn=+;
const int inf=1e9+;
int n;
int cost[maxn][maxn];//cost[i][j]两点之间的距离
int mincost[maxn];//从集合x出发到各点的最近距离
bool vis[maxn];//是否在本集合中
void Prim()
{
mincost[]=;//选定1为起点
int ans=;
while(true)
{
int flag=-;
for(int i=;i<=n;i++)
{
if(!vis[i]&&(flag==-||mincost[i]<mincost[flag]))
flag=i;
}
if(flag==-) break;
vis[flag]=true;
ans+=mincost[flag];
for(int i=;i<=n;i++)
mincost[i]=min(mincost[i],cost[flag][i]);//更新 }
cout<<ans<<endl;
}
int main()
{
while(cin>>n)
{
if(n==) break;
for(int i=;i<=n;i++)//初始化
{
for(int j=;j<=n;j++)
{
cost[i][j]=inf;
}
cost[i][i]=;
mincost[i]=inf;
vis[i]=false;
}
for(int i=;i<n*(n-)/;i++)
{
int u,v,w;
cin>>u>>v>>w;
cost[u][v]=w;
cost[v][u]=w; }
Prim();
}
}

Kruskal:

在整个图中找到一条   最小的  不会形成环    的边

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100*100+5;
int fa[maxn];
int n;
struct Edge
{
int u,v,w;//起点 终点 边的权值
}edge[maxn];
bool cmp(const Edge a,const Edge b)//快排
{
return a.w<b.w;//按权值从小到大
}
int Get_fa(int x)//找父亲节点
{
if(fa[x]==x) return x;
return fa[x]=Get_fa(fa[x]);
}
void Kruskal()
{
for(int i=1;i<=n;i++) fa[i]=i; //刚开始每个节点的父亲都是自己,熟悉的并查集
int ans=0,cnt=1;//cnt从1开始 为什么呢? 因为n-1条边确定n个点
for(int i=0;i<n*(n-1)/2;i++) //遍历每一条边
{
int x=Get_fa(edge[i].u);
int y=Get_fa(edge[i].v);
int w=edge[i].w;
if(x!=y)//判断是否属于同一个集合
{
ans+=w;
fa[x]=y;
cnt++;
}
if(cnt==n)//n个村庄已经连接起来了
{
break;
//cout<<ans<<endl;
//return ;
}
}
cout<<ans<<endl;
}
int main()
{
while(cin>>n)
{
if(n==0) break;
for(int i=0;i<n*(n-1)/2;i++) cin>>edge[i].u>>edge[i].v>>edge[i].w;//输入边
sort(edge,edge+(n*(n-1)/2),cmp);//从小到大排序
Kruskal();
}
}

  

 

还是畅通工程(prim和kruskal)的更多相关文章

  1. hdu 1233 还是畅通工程 (prim, kruskal)

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

  2. HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. HDU-1233 还是畅通工程 (prim 算法求最小生成树)

    prim 算法求最小生成树 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  4. hdu 1863 畅通工程 (prim)

    畅通工程Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. 还是畅通工程,最小生成树kruskal

    题目描述:     某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可 ...

  6. 畅通工程再续 (kruskal算法的延续)

    个人心得:这题其实跟上一题没什么区别,自己想办法把坐标啥的都给转换为对应的图形模样就好了 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实 ...

  7. hdoj1879 继续畅通工程(Prime || Kruskal)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1879 思路 这题和hdoj1102很像,图中的有一些路已经修好了,对于这些已经修好的路,我们令还需要修 ...

  8. hdoj1863 畅通工程(Prime || Kruskal)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1863 思路 最小生成树问题,使用Prime算法或者Kruskal算法解决.这题在hdoj1233的基础 ...

  9. hdoj1233 还是畅通工程(Prime || Kruskal)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1233 思路 最小生成树问题,使用Prime算法或者Kruskal算法解决. 代码 Prime算法: # ...

  10. HDU 1879 继续畅通工程(Prim||Kruscal模板题)

    原题链接 Prim(点归并) //异或运算:相同为假,不同为真 #include<cstdio> #include<algorithm> #define maxn 105 us ...

随机推荐

  1. 树莓派研究笔记(7)-- lakka 《仙剑奇侠传》的完美移植

    仙剑,这是我玩的第一个电脑游戏.真的太经典,无法超越.原来第一次玩的缺少开场动画,很多地方不明不白的.现在终于我们可以把这个梦想继续到树莓派中. LAKKA是支持DOS模拟器的,所以我们一定要下载DO ...

  2. CLRMonitor - 跟踪CLR内部执行过程工具

    CLRMonitor v1.0.1511.13 点击此处下载 软件介绍:这款软件主要用于跟踪CLR内部执行过程,定位当前程序执行的命名空间以及方法名等信息.可以迅速找到被跟踪程序的当前执行方法名.本软 ...

  3. Spark的序列化

    spark的序列化主要使用了hadoop的writable和java的Serializable. 说到底就是使用hadoop的writable替换了java的默认序列化实现方式. class Seri ...

  4. 操作系统 Linux ex1 note

    ctrl + alt + T 命令行 ctrl + alt + F7 ctrl + alt + F1-6 ls 列出所有文件 / 根目录 ~ /home/username cd 切换路径 . 当前目录 ...

  5. 多线程学习-基础( 十一)synchronized关键字修饰方法的简单案例

    一.本案例设计到的知识点 (1)Object的notify(),notifyAll(),wait()等方法 (2)Thread的sleep(),interrupt(). (3)如何终止线程. (4)如 ...

  6. vim尝试

    http://3502990.blog.51cto.com/3492990/985750

  7. C# DLL(程序集)的生成和调用

    日期:2018年11月24日 环境:Window 10,VS2015 一.利用VS2015自带的工具生成DLL 步骤: 1.利用C#准备一个.cs文件: using System; public cl ...

  8. Binder学习笔记(十一)—— 智能指针

    轻量级指针 Binder的学习历程爬到驱动的半山腰明显感觉越来越陡峭,停下业务层的学习,补补基础层知识吧,这首当其冲的就是智能指针了,智能指针的影子在Android源码中随处可见.打开framewor ...

  9. [SinGuLaRiTy] 2017-07-26 综合性测试

    [SinGuLaRiTy-1032] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved.               单词 (word) 题目描述 ...

  10. EOS 增发与生产者的奖励制度

    EOS每年增发1%的机制在系统合约中,其实说每年增发1%只是一年的总数,其实是只要在出块,EOS就在增发的路途中,下面分析一下增发的代码. 其实增发的1%的都是分给所有区块生产者的,只要出块了或者获得 ...