最小生成树练习1(克鲁斯卡尔算法Kruskal)
今天刷一下水题练手入门,明天继续。
poj1861 Network(最小生成树)新手入门题。
题意:输出连接方案中最长的单根网线长度(必须使这个值是所有方案中最小的),然后输出方案。
题解:本题没有直接求生成树,但如果连接n个集线器的方案多于n-1条边,那么必存在回路,因此去掉某些边剩下的边和所有顶点构成一个生成树。对于一个图的最小生成树来说,它的最大边满足所有生成树的最大边里最小,正和题意。
吐槽:题目样例是错的。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
struct edge{
int u,v,w;
}e[];
int f[N],a[N],ai;
int n,m,ma;
int cmp(edge a,edge b){
return a.w<b.w;
}
void init(){
for(int i=;i<=n;++i)
f[i]=i;
}
int fin(int x){
if(x!=f[x])f[x]=fin(f[x]);
return f[x];
}
void Kruskal(){
ma=ai=;
int u,v,i;
init();
for(i=;i<m;++i){
u=e[i].u;
v=e[i].v;
if((u=fin(u))!=(v=fin(v))){
f[u]=v;
a[ai++]=i;
ma=max(e[i].w,ma);
}
if(ai>=n-)break;
}
}
int main(){
int i,u,v,w;
scanf("%d%d",&n,&m);
for(i=;i<m;++i){
scanf("%d%d%d",&u,&v,&w);
e[i]=edge{u,v,w};
}
sort(e,e+m,cmp);
Kruskal();
printf("%d\n%d\n",ma,ai);
for(i=;i<ai;++i)
printf("%d %d\n",e[a[i]].u,e[a[i]].v);
return ;
}
poj1251 Jungle Roads(最小生成树)水题。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
struct edge{
int u,v,w;
}e[];
int f[N];
int n,m,ans;
int cmp(edge a,edge b){
return a.w<b.w;
}
void init(){
for(int i=;i<n;++i)
f[i]=i;
}
int fin(int x){
if(x!=f[x])f[x]=fin(f[x]);
return f[x];
}
void Kruskal(){
ans=;
int u,v,i;
init();
for(i=;i<m;++i){
u=e[i].u;
v=e[i].v;
if((u=fin(u))!=(v=fin(v))){
f[u]=v;
ans+=e[i].w;
}
}
}
int main(){
int i,j,w,k;
char u[],v[];
while(scanf("%d",&n),n){
m=;
for(i=;i<n-;++i){
scanf("%s %d",u,&k);
for(j=;j<k;++j){
scanf("%s %d",v,&w);
e[m++]={u[]-'A',v[]-'A',w};
}
}
sort(e,e+m,cmp);
Kruskal();
printf("%d\n",ans);
}
return ;
}
poj1287 Networking(最小生成树)水题。
用prim要注意两个地点之间的线路可能多条,即有重边。我这里练的是Kruskal,题目没给边数,但知道点数最多50,则边数最多50*49/2=1225条,有重边,开大点数组就行,因为数据弱,随便开个1500都过了,醉。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=;
struct edge{
int u,v,w;
}e[M];
int f[];
int n,m,ans;
int cmp(edge a,edge b){
return a.w<b.w;
}
void init(){
for(int i=;i<=n;++i)
f[i]=i;
}
int fin(int x){
if(x!=f[x])f[x]=fin(f[x]);
return f[x];
}
void Kruskal(){
ans=;
int u,v,i;
init();
for(i=;i<m;++i){
u=e[i].u;
v=e[i].v;
if((u=fin(u))!=(v=fin(v))){
f[u]=v;
ans+=e[i].w;
}
}
}
int main(){
int i,u,v,w;
while(scanf("%d",&n),n){
scanf("%d",&m);
for(i=;i<m;++i){
scanf("%d%d%d",&u,&v,&w);
e[i]={u,v,w};
}
sort(e,e+m,cmp);
Kruskal();
printf("%d\n",ans);
}
return ;
}
poj2031 Building a Space Station(最小生成树)题目看老久,其实挺水…空间站存在一些球形单间,如果单间之间接触,重叠或用走廊连接则连通。给出单间坐标和半径,求要使得所有单间相连通的走廊总长度的最小值。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int M=;
const int N=;
struct edge{
int u,v;
double w;
}e[M];
double a[N],b[N],c[N],r[N];
int f[N];
int n,m;
double ans;
int cmp(edge a,edge b){
return a.w<b.w;
}
double dist(int i,int j){
return sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j])+(c[i]-c[j])*(c[i]-c[j]))-r[i]-r[j];
}
void init(){
for(int i=;i<n;++i) f[i]=i;
}
int fin(int x){
if(x!=f[x])f[x]=fin(f[x]);
return f[x];
}
void Kruskal(){
ans=;
int u,v,i,cnt=;
init();
for(i=;cnt<n-;++i){
u=e[i].u;
v=e[i].v;
if((u=fin(u))!=(v=fin(v))){
f[u]=v;
ans+=e[i].w;
cnt++;
}
}
}
int main(){
int i,j;
double w;
while(scanf("%d",&n),n){
for(i=;i<n;++i){
scanf("%lf%lf%lf%lf",&a[i],&b[i],&c[i],&r[i]);
}
for(m=i=;i<n-;++i){
for(j=i+;j<n;++j){
w=dist(i,j);
if(w<) w=;
e[m++]={i,j,w};
}
}
sort(e,e+m,cmp);
Kruskal();
printf("%.3f\n",ans);
}
return ;
}
poj2421 Constructing Roads(最小生成树)水题。有些点已经连边,进行标记,加边时将其边赋值为0即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=;
const int N=;
struct edge{
int u,v,w;
}e[M];
int f[N];
int g[N][N],vis[N][N];
int n,ans;
int cmp(edge a,edge b){
return a.w<b.w;
}
void init(){
for(int i=;i<=n;++i) f[i]=i;
}
int fin(int x){
if(x!=f[x])f[x]=fin(f[x]);
return f[x];
}
void Kruskal(){
ans=;
int u,v,i,cnt=;
init();
for(i=;cnt<n-;++i){
u=e[i].u;
v=e[i].v;
if((u=fin(u))!=(v=fin(v))){
f[u]=v;
ans+=e[i].w;
cnt++;
}
}
}
int main(){
int i,j,a,b,ei,m;
while(scanf("%d",&n)==){
for(i=;i<=n;++i)
for(j=;j<=n;++j)
scanf("%d",&g[i][j]);
memset(vis,,sizeof(vis));
scanf("%d",&m);
while(m--){
scanf("%d%d",&a,&b);
vis[a][b]=;
}
ei=;
for(i=;i<n;++i){
for(j=i+;j<=n;++j){
if(vis[i][j]) e[ei++]={i,j,};
else e[ei++]={i,j,g[i][j]};
}
}
sort(e,e+ei,cmp);
Kruskal();
printf("%d\n",ans);
}
return ;
}
最小生成树练习1(克鲁斯卡尔算法Kruskal)的更多相关文章
- 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...
- 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...
- 最小生成树——Kruscal(克鲁斯卡尔算法)
一.核心思想 将输入的数据由小到大进行排序,再使用并查集算法(传送门)将每个点连接起来,同时求和. 个人认为这个算法比较偏向暴力,有些题可能会超时. 二.例题 洛谷-P3366 题目地址:ht ...
- 克鲁斯卡尔算法(Kruskal算法)求最小生成树
题目传送:https://loj.ac/p/10065 1.排序函数sort,任何一种排序算法都行,下面的示例代码中,我采用的是冒泡排序算法 2.寻源函数getRoot,寻找某一个点在并查集中的根,注 ...
- 最小生成树之Kruskal(克鲁斯卡尔)算法
学习最小生成树算法之前我们先来了解下下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的所 ...
- c/c++ 用克鲁斯卡尔(kruskal)算法构造最小生成树
c/c++ 用克鲁斯卡尔(kruskal)算法构造最小生成树 最小生成树(Minimum Cost Spanning Tree)的概念: 假设要在n个城市之间建立公路,则连通n个城市只需要n-1条线路 ...
- 最小生成树之克鲁斯卡尔(Kruskal)算法
学习最小生成树算法之前我们先来了解下 下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的 ...
- JS实现最小生成树之克鲁斯卡尔(Kruskal)算法
克鲁斯卡尔算法打印最小生成树: 构造出所有边的集合 edges,从小到大,依次选出筛选边打印,遇到闭环(形成回路)时跳过. JS代码: //定义邻接矩阵 let Arr2 = [ [0, 10, 65 ...
- 最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)
普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...
随机推荐
- Writing On-Error Trigger In Oracle Forms
Suppose you want to handle an error in oracle forms and want to display custom error message for tha ...
- Populating Display Item Value On Query In Oracle Forms
Write Post-Query trigger for the block you want to fetch the field value for display item.ExampleBeg ...
- JUnit 单元测试 配置
选中工程,右键 built path , add liberaries , JUnit , JUnit4 这样就不用每次测试时都在main方法中写了
- Timeout expired超时时间已到. 达到了最大池大小 错误及Max Pool Size设置
此文章非原创,仅为分享.学习!!! 参考数据库链接串: <add key="data" value="server=192.168.1.123; port=3306 ...
- FLASH CC 2015 CANVAS (二)html中写JS调用flash中的元件、函数、变量
注意 此贴 为个人边“开荒”边写,所以不保证就是最佳做法,也难免有错误! 正式教程会在后续开始更新 当你导出第一个canvas后,你会在保存fla的文件夹里 (每个项目默认位置)看到 如下文件,(请先 ...
- git学习笔记10-新开发的功能不想要了-强行删除分支
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支. 现在,你终于接 ...
- oracle的基本查询~下
SQL> --别名SQL> select ename 姓名, job as "工作" ,sal "薪水" from emp; 姓名 ...
- 《转》Ubuntu 12.04常用的快捷键
Ubuntu 12.04常用的快捷键 超级键操作 1.超级键(Win键)–打开dash. www.2cto.com 2.长按超级键– 启动Launcher.并快捷键列表. 3.按住 ...
- iOS - OC 异常处理
1.@try 语句 @try { // Code that can potentially throw an exception 可能会抛出异常的代码块 statement . . . } @catc ...
- Linux小知识
1,ubuntu下,开机如何进行命令行? 图形模式下,首先进入终端: 1. 找到 /etc/default/grub文件: 2. 修改 GRUB_CMDLINE_LINUX_DEFAULT=" ...