HDU - 1863 畅通工程(最小生成树)
d.m个村庄,n条路,计算出所有村庄畅通需要的最低成本。
s.最小生成树
c.Prim算法:cost[a][b]和cost[b][a]都得赋值。
- /*
- Prim算法
- Prim求MST
- 耗费矩阵cost[][],标号从0开始,0~n-1
- 返回最小生成树的权值,返回-1表示原图不连通
- */
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- using namespace std;
- const int INF=0x3f3f3f3f;
- const int MAXN=;
- bool vis[MAXN];
- int lowc[MAXN];
- //点是 0 n-1
- int Prim(int cost[][MAXN],int n){
- int ans=;
- memset(vis,false,sizeof(vis));
- vis[]=true;
- for(int i=;i<n;i++)lowc[i]=cost[][i];
- for(int i=;i<n;i++){
- int minc=INF;
- int p=-;
- for(int j=;j<n;j++)
- if(!vis[j]&&minc>lowc[j]){
- minc=lowc[j];
- p=j;
- }
- if(minc==INF)return -;//原图不连通
- ans+=minc;
- vis[p]=true;
- for(int j=;j<n;j++)
- if(!vis[j]&&lowc[j]>cost[p][j])
- lowc[j]=cost[p][j];
- }
- return ans;
- }
- int main(){
- int cost[MAXN][MAXN];
- int N,M;
- int u,v,w;
- while(~scanf("%d",&N)){
- if(N==)break;
- scanf("%d",&M);
- for(int i=;i<MAXN;++i){
- for(int j=;j<MAXN;++j){
- cost[i][j]=INF;
- }
- }
- for(int i=;i<N;++i){
- scanf("%d%d%d",&u,&v,&w);
- --u;--v;
- cost[u][v]=cost[v][u]=w;
- }
- int ans=Prim(cost,M);
- if(ans==-)printf("?\n");
- else printf("%d\n",ans);
- }
- return ;
- }
c2.Kruskal算法:加入a->b或者b->a一条边即可。
- /*
- Kruskal算法
- Kruskal算法求MST
- */
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- const int MAXN=;//最大点数
- const int MAXM=;//最大边数
- int F[MAXN];//并查集使用
- struct Edge{
- int u,v,w;
- }edge[MAXM];//存储边的信息,包括起点/终点/权值
- int tol;//边数,加边前赋值为0
- void addedge(int u,int v,int w){
- edge[tol].u=u;
- edge[tol].v=v;
- edge[tol++].w=w;
- }
- //排序函数,将边按照权值从小到大排序
- bool cmp(Edge a,Edge b){
- return a.w<b.w;
- }
- int find(int x){
- if(F[x]==-)return x;
- else return F[x]=find(F[x]);
- }
- //传入点数,返回最小生成树的权值,如果不连通返回-1
- int kruskal(int n){
- memset(F,-,sizeof(F));
- sort(edge,edge+tol,cmp);
- int cnt=;//计算加入的边数
- int ans=;
- for(int i=;i<tol;i++){
- int u=edge[i].u;
- int v=edge[i].v;
- int w=edge[i].w;
- int t1=find(u);
- int t2=find(v);
- if(t1!=t2){
- ans+=w;
- F[t1]=t2;
- cnt++;
- }
- if(cnt==n-)break;
- }
- if(cnt<n-)return -;//不连通
- else return ans;
- }
- int main(){
- int N,M;
- int u,v,w;
- while(~scanf("%d",&N)){
- if(N==)break;
- scanf("%d",&M);
- tol=;
- for(int i=;i<N;++i){
- scanf("%d%d%d",&u,&v,&w);
- --u;--v;
- addedge(u,v,w);
- }
- int ans=kruskal(M);
- if(ans==-)printf("?\n");
- else printf("%d\n",ans);
- }
- return ;
- }
HDU - 1863 畅通工程(最小生成树)的更多相关文章
- HDU 1863 畅通工程(最小生成树,prim)
题意: 给出图的边和点数,要求最小生成树的代价,注:有些点之间是不可达的,也就是可能有多个连通图.比如4个点,2条边:1-2,3-4. 思路: 如果不能连通所有的点,就输出‘?’.之前以为每个点只要有 ...
- HDU 1863 畅通工程 最小生成树
思路: 比较典型的最小生成树的题目了..在这里用求最小生成树的经典算法K(Kruskal)算法和P(Prim)算法.我的 K 算法用的是结构体来存图,P 算法用的是邻接矩阵来存图,K算法的复杂度是O( ...
- hdu 1863 畅通工程 (并查集+最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others) M ...
- <hdu - 1863> 畅通工程 并查集和最小生成树问题
本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 Problem Description: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以 ...
- hdu 1863 - 畅通工程(MST)
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 题解报告:hdu 1863 畅通工程
Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可 ...
- HDU 1863 畅通工程
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
- HDU 1863 畅通工程(Prim算法求解MST)
题目: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现 ...
- HDU 1863 畅通工程 克鲁斯卡尔算法
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 1863 畅通工程(Kruskal)
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
随机推荐
- Jmeter接口测试实战-Cookies
场景: 接口测试时常都需要登录,请求方式(post), 登录常用的方法有通过获取token, 获取session, 获取cookie, 等等. 这几种都有一个共同的特点, 有效期(expires). ...
- Charm Bracelet(01背包)
Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fil ...
- 【HDOJ6324】Grab The Tree(博弈)
题意: 思路: #include <stdio.h> #include <vector> #include <algorithm> #include <str ...
- SQL中distinct的用法(四种示例分析)
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只 用它来返回不重复记录的条数,而不是用它来返回不重记录的 ...
- SHELL脚本运行的几种方法以及区别
#1 给脚本加上执行权限chmod u+x a.sh, 而后就可以直接用全路径来执行脚本了,比如当前文件夹下用./a.sh,如果如果脚本所在目录在PATH环境变量之中, 则直接用a.sh即可(这和运行 ...
- js的基础(平民理解的执行上下文/调用堆栈/内存栈/值类型/引用类型)
与以前的切图比较,现在的前端开发对js的要求似乎越来越高,在开发中,我们不仅仅是要知道如何运用现有的框架(react/vue/ng), 而且我们对一些基础的知识的依赖越来越大. 现在我们就用平民的方法 ...
- WinCE5.0如何安装.NET3.5
首先去微软官网下载.NET Compact Framework 3.5 Redistributable 点击下载 下载页面 一共有两种安装方式,我们先介绍常规的安装方式 1.设备连接到电脑,然后双击下 ...
- 学习swift从青铜到王者之Swift语言函数05
1.定义一个函数以及调用 //一,定义一个无参无返回值函数 func fun1(){ print("this is first function") } fun1() 2.定义一个 ...
- C#编程语言及.NET 平台快速入门指南
github: https://github.com/mfjiang e-mail: hamlet.jiang@live.com ⼀.C#,CLR,IL,JIT概念 以及 .NET 家族 (⼀)基 ...
- influxDB系列(二)
来源于我在一个influxDB的qq交流群中的提问, 然后有个人 提了一个问题---->触发了我的思考!! :) 哈哈 自己的每一次说出一个回答,都是一次新的思考,也都进行了一些查阅资料,思考, ...