hdu1863-畅通工程(Prime Kruskal)

2024-02-10 07:18

本文主要是介绍hdu1863-畅通工程(Prime Kruskal),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

畅通工程

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 27327 Accepted Submission(s): 11956

Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。

Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。

Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。

Sample Input
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100

Sample Output
3
?

Prime

#include<cstdio>
#include<iostream>
#include<string.h>
#define INF 0x3f3f3f3f
using namespace std;
const int V=1000;
const int E=100000;
int graph[V][V];
int cost[V];  //记录目前要把第i个点加入正确联盟所需的花费
int last[V];  // 记录第i个点 透过谁加入的正确联盟
int visit[V]; // 记录是否加入正确联盟
int fin_cnt;  //记录加入正确联盟的个数
int tot_cost;  // 记录总花费void init(int N){ //N:点数memset(visit,0,sizeof(visit));memset(last,-1,sizeof(last));cost[1] = 0;visit[1] =1;for(int i = 2; i <= N;i++){cost[i] = graph[1][i];if(cost[i] != INF)last[i]=1;}fin_cnt=1;
}int prime(int N){int Min;int Min_idx;while(fin_cnt < N){Min = INF;Min_idx=-1;for(int i = 2; i <= N ;i++){if(visit[i])continue;if(cost[i] < Min)Min=cost[i],Min_idx=i;}if(Min_idx==-1)  break;visit[Min_idx] =1;tot_cost += cost[Min_idx];fin_cnt++;// 看看还有没有被选择的点能透过Min_idx 变近的for(int i=2;i<=N;i++){if(visit[i] ) // 被选择就跳过continue;if(graph[Min_idx][i] < cost[i] )  //有更近就更新cost[i]=graph[Min_idx][i],last[i]=Min_idx;}}if(fin_cnt < N)return 0;return 1;
}
int main(){//freopen("in.txt","r",stdin);ios_base::sync_with_stdio(false);int n,m;while(cin>>n>>m,n  ){for(int i=1;i<=V;i++)for(int j=1;j<=V;j++)graph[i][j]=(i==j ? 0 :INF);tot_cost=0;int t1,t2,t3;for(int i=0;i< n;i++){cin>>t1>>t2>>t3;graph[t1][t2]=graph[t2][t1]=t3;}init(m);int ret=prime(m);if(ret)cout<<tot_cost<<endl;elsecout<<"?"<<endl;}}

Kruskal

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN_E 100000
#define MAXN_V 100000
using namespace std;
struct Edge{int fm,to,dist;
}e[MAXN_E];
int fa[MAXN_V],n,m;
bool cmp(Edge a,Edge b)
{return a.dist < b.dist;
}
int getfa(int x){if(fa[x]==x) return fa[x];else return fa[x] = getfa(fa[x]);
}
int same(int x,int y){return getfa(x)==getfa(y);
}
void merge(int x,int y)
{int fax=getfa(x),fay=getfa(y);fa[fax]=fay;
}
int main()
{//freopen("in.txt","r",stdin);while(scanf("%d%d",&m,&n),m){for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].fm,&e[i].to,&e[i].dist);sort(e+1,e+m+1,cmp);for(int i=1;i<=n;i++)fa[i]=i;int rst=n,ans=0;for(int i=1;i<=m && rst>1;i++){int x=e[i].fm,y=e[i].to;if(same(x,y)) continue;else{merge(x,y);rst--;ans+=e[i].dist;}}if(rst==1)printf("%d\n",ans);elseprintf("?\n");}return 0;
}

这篇关于hdu1863-畅通工程(Prime Kruskal)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/696472

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

二、Maven工程的创建--JavaSEJavaEE

1、idea创建Maven JavaSE工程:  2、idea创建Maven JavaEE工程:   (1)手动创建 (2)插件方式创建 在idea里安装插件JBLJavaToWeb; 选择需要生成的项目文件后,右击: 项目的webapp文件夹出现小蓝点,代表成功。

三、Maven工程的构建

首先,创建和构建是两个概念。 构建是指将源代码、依赖库和资源文件等转换为可执行或可部署的应用程序的过程。 在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。 项目构建是软件开发过程中至关重要的一部分,它能够大大提高软件开发效率,使得开发人员更加专注于应用程序的开发和维护,而不必关心应用程序的构建细节。 同时,项目构建还能将多人写的代码聚合,并能够自动化项目的构建和部署,

我在高职教STM32——准备HAL库工程模板(1)

新学期开学在即,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项

C语言-数据结构 克鲁斯卡尔算法(Kruskal)邻接矩阵存储

相比普里姆算法来说,克鲁斯卡尔的想法是从边出发,不管是理解上还是实现上都更简单,实现思路:我们先把找到所有边存到一个边集数组里面,并进行升序排序,然后依次从里面取出每一条边,如果不存在回路,就说明可以取,否则就跳过去看下一条边。其中看是否是回路这个操作利用到了并查集,就是判断新加入的这条边的两个顶点是否在同一个集合中,如果在就说明产生回路,如果没在同一个集合那么说明没有回路可以加入

java工程的导入jar包

由于现在学习java web,java工程导入jar包都忘记了。 在此想记录一下:工程项目名:右击 -- Build Path --add External Archives 点击会弹出一个框 ,选择你要导入的jar路径就可以了。

【MyBatis学习14】MyBatis的逆向工程生成代码

1. 什么是逆向工程 mybatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码。 2. 使用逆向工程 使用mybatis的逆向工程,需要导入逆向

maven-聚合工程

聚合工程: 聚合工程里可以分为顶级项目(顶级工程、父工程)与子工程,这两者的关系其实就是父子继承的关系,子工程在maven里称之为模块(module),模块之间是平级,是可以相互依赖的。子模块可以使用顶级工程里所有的资源(依赖),子模块之间如果要使用资源,必须构建依赖(构建关系)一个顶级工程是可以由多个不同的子工程共同组合而成。