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

题解:

纯最小生成树,只是有些边已经确定了要加入生成树中,特殊处理一下这些边就可以了。

kruskal算法:

由于有些边已经确定,所以在调用kruskal()之前,就把这条边的两个顶点放在一个集合就可以了。

 #include<cstdio>//hdu1102 最小生成树 kruskal
#include<algorithm>
#define N 110
using namespace std; struct node
{
int x,y,dis;
}edge[N*N]; int fa[N]; bool cmp(node a, node b)
{
return a.dis<=b.dis;
} int find(int x)
{
return fa[x]==x?x:find(fa[x]);
} bool un(int x, int y)
{
x = find(x);
y = find(y);
if(x!=y)
{
fa[x] = y;
return true;
}
return false;
} int kruskal(int n,int sum)
{
int len = ,x,y,i;
sort(edge,edge+sum,cmp);
for(i = ; i<sum; i++)
{
x = edge[i].x;
y = edge[i].y;
if(un(x,y))
len += edge[i].dis;
}
return len;
} int main()
{
int n,m,i,j,x,y,dis,sum;
while(scanf("%d",&n)!=EOF)
{
sum = ;
for(i = ; i<=n; i++)
for(j = ; j<=n; j++)
{
scanf("%d",&dis);
if(i>=j) continue;
edge[sum].x = i;
edge[sum].y = j;
edge[sum].dis = dis;
sum++;
} for(i = ; i<=n; i++)
fa[i] = i; scanf("%d",&m);
for(i = ; i<m; i++)//先处理以确定的边
{
scanf("%d%d",&x,&y);
un(x,y);
}
printf("%d\n",kruskal(n,sum));
}
return ;
}

prim算法:

在prim算法中就不能像kruskal算法那样先预处理了,而要在算法中运行。由于prim算法在每次松弛时总是找最小的点,题目中两条村庄的距离是非负数,那么我们可以把确定要加入生成树的边的两个顶点的距离设为-1,这样就能确保他们都加入到生成树中了。

注意:赋值或修改邻接矩阵的无向图时, 正反两条边都要操作。

 #include<cstdio>//hdu1102 最小生成树 prim
#include<algorithm>
#define N 110
#define INF 0x7fffffff
using namespace std; int arc[N][N]; int prim(int n)
{
int low[N];
int k,i,j,min,len = ;
for(i = ; i<=n; i++)
{
low[i] = arc[][i];
} for(i = ; i<=n; i++)
{
min = INF;
for(j = ; j<=n; j++)
{
if(low[j]!= && low[j]<min)
{
min = low[j];
k = j;
}
} if(low[k]>)
len += low[k];
low[k] = ; for(int j = ; j<=n; j++)
{
if(low[j]!= && arc[k][j]<low[j])
{
low[j] = arc[k][j];
}
}
}
return len;
} int main()
{
int n,q,u,v,i,j;
while(scanf("%d",&n)!=EOF)
{
for(i = ; i<=n; i++)
for(j = ; j<=n; j++)
scanf("%d",&arc[i][j]); scanf("%d",&q);
for(i = ; i<q; i++)
{
scanf("%d%d",&u,&v);
arc[v][u] = arc[u][v] = -;
//正反向都要置为-1, 因为在松弛的过程中,两个方向都有可能
}
printf("%d\n",prim(n));
}
return ;
}

HDU1102 Constructing Roads —— 最小生成树的更多相关文章

  1. hdu Constructing Roads (最小生成树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1102 /************************************************* ...

  2. HDU 1102 Constructing Roads (最小生成树)

    最小生成树模板(嗯……在kuangbin模板里面抄的……) 最小生成树(prim) /** Prim求MST * 耗费矩阵cost[][],标号从0开始,0~n-1 * 返回最小生成树的权值,返回-1 ...

  3. POJ 2421 Constructing Roads (最小生成树)

    Constructing Roads Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  4. hdu1102 Constructing Roads (简单最小生成树Prim算法)

    Problem Description There are N villages, which are numbered from 1 to N, and you should build some ...

  5. POJ2421 & HDU1102 Constructing Roads(最小生成树)

    嘎唔!~又一次POJ过了HDU错了...不禁让我想起前两天的的Is it a tree?   orz..这次竟然错在HDU一定要是多组数据输入输出!(无力吐槽TT)..题目很简单,炒鸡水! 题意: 告 ...

  6. hdu1102 Constructing Roads 基础最小生成树

    //克鲁斯卡尔(最小生成树) #include<cstdio> #include<iostream> #include<algorithm> using names ...

  7. POJ - 2421 Constructing Roads (最小生成树)

    There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...

  8. hdu 1102 Constructing Roads(最小生成树 Prim)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Problem Description There are N villages, which ...

  9. (step6.1.4)hdu 1102(Constructing Roads——最小生成树)

    题目大意:输入一个整数n,表示村庄的数目.在接下来的n行中,每行有n列,表示村庄i到村庄 j 的距离.(下面会结合样例说明).接着,输入一个整数q,表示已经有q条路修好. 在接下来的q行中,会给出修好 ...

随机推荐

  1. char *argv[] 与 char **argv

    #include<stdio.h> #include<string.h> int main(int argc,char *argv[])//同int main(int argc ...

  2. CF997D

    分析: 假设在第一个树上我们有一个长度为x的环,在第二树上我们有一个长度为y的环,那么可以在叉积树上构造出$\binom{x+y}{x}$个长度为x+y的环 问题的关键就变成了如何统计出在一个树上的长 ...

  3. 【IntelliJ IDEA】idea显示工具栏

    idea显示工具栏 在view->勾选对应按钮即可

  4. IOS 开发推荐经常使用lib

    1. Mantle Mantle 让我们能简化 Cocoa 和 Cocoa Touch 应用的 model 层.简单点说.程序中常常要进行网络请求,请求到得通常是 json 字符串.我们通常会建一个 ...

  5. DataGridView.DataSource= list(Of T)

    注:本文样例的代码承接上篇文章:DataTable填充实体类返回泛型集合. 在D层查询完毕之后.我们将DataTable转化为泛型集合.然后经过中间各层,返回U层.到了这里,问题来了.我们这时候要将这 ...

  6. ios文件系统文件目录操作

    对于一个运行在iPhone得app,它只能访问自己根目录下得一些文件(所谓sandbox). 一个app发布到iPhone上后,目录结构如下: 1.其中获取 app root 可以用 NSHomeDi ...

  7. linux 下weblogic启动和停止

    启动weblogic 本例中weblogic 安装路径为:/data/weblogic/wls/wlserver_10.3/ 1. 启动nodeManager cd /data/weblogic/wl ...

  8. Jquery 文字模拟输入效果

    https://github.com/mattboldt/typed.js/ 挺酷炫的

  9. TensorFlow从入门到实战资料汇总 2017-02-02 06:08 | 数据派

    TensorFlow从入门到实战资料汇总 2017-02-02 06:08 | 数据派 来源:DataCastle数据城堡 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学 ...

  10. C#获取Access数据库中的所有表名和列名

    //C#获取Access数据库中的所有表名和列名    string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" ...