今天刷一下水题练手入门,明天继续。

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)的更多相关文章

  1. 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal&#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...

  2. 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal&#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...

  3. 最小生成树——Kruscal(克鲁斯卡尔算法)

    一.核心思想 ​ 将输入的数据由小到大进行排序,再使用并查集算法(传送门)将每个点连接起来,同时求和. ​ 个人认为这个算法比较偏向暴力,有些题可能会超时. 二.例题 洛谷-P3366 题目地址:ht ...

  4. 克鲁斯卡尔算法(Kruskal算法)求最小生成树

    题目传送:https://loj.ac/p/10065 1.排序函数sort,任何一种排序算法都行,下面的示例代码中,我采用的是冒泡排序算法 2.寻源函数getRoot,寻找某一个点在并查集中的根,注 ...

  5. 最小生成树之Kruskal(克鲁斯卡尔)算法

    学习最小生成树算法之前我们先来了解下下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的所 ...

  6. c/c++ 用克鲁斯卡尔(kruskal)算法构造最小生成树

    c/c++ 用克鲁斯卡尔(kruskal)算法构造最小生成树 最小生成树(Minimum Cost Spanning Tree)的概念: 假设要在n个城市之间建立公路,则连通n个城市只需要n-1条线路 ...

  7. 最小生成树之克鲁斯卡尔(Kruskal)算法

    学习最小生成树算法之前我们先来了解下 下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的 ...

  8. JS实现最小生成树之克鲁斯卡尔(Kruskal)算法

    克鲁斯卡尔算法打印最小生成树: 构造出所有边的集合 edges,从小到大,依次选出筛选边打印,遇到闭环(形成回路)时跳过. JS代码: //定义邻接矩阵 let Arr2 = [ [0, 10, 65 ...

  9. 最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)

    普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...

随机推荐

  1. 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 ...

  2. 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 ...

  3. JUnit 单元测试 配置

    选中工程,右键  built path , add liberaries , JUnit , JUnit4 这样就不用每次测试时都在main方法中写了

  4. Timeout expired超时时间已到. 达到了最大池大小 错误及Max Pool Size设置

    此文章非原创,仅为分享.学习!!! 参考数据库链接串: <add key="data" value="server=192.168.1.123; port=3306 ...

  5. FLASH CC 2015 CANVAS (二)html中写JS调用flash中的元件、函数、变量

    注意 此贴 为个人边“开荒”边写,所以不保证就是最佳做法,也难免有错误! 正式教程会在后续开始更新 当你导出第一个canvas后,你会在保存fla的文件夹里 (每个项目默认位置)看到 如下文件,(请先 ...

  6. git学习笔记10-新开发的功能不想要了-强行删除分支

    添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支. 现在,你终于接 ...

  7. oracle的基本查询~下

    SQL> --别名SQL> select ename 姓名, job as "工作" ,sal "薪水" from emp; 姓名          ...

  8. 《转》Ubuntu 12.04常用的快捷键

    Ubuntu 12.04常用的快捷键   超级键操作   1.超级键(Win键)–打开dash.   www.2cto.com   2.长按超级键– 启动Launcher.并快捷键列表.   3.按住 ...

  9. iOS - OC 异常处理

    1.@try 语句 @try { // Code that can potentially throw an exception 可能会抛出异常的代码块 statement . . . } @catc ...

  10. Linux小知识

    1,ubuntu下,开机如何进行命令行? 图形模式下,首先进入终端: 1. 找到 /etc/default/grub文件: 2. 修改 GRUB_CMDLINE_LINUX_DEFAULT=" ...