HDU1102 Constructing Roads —— 最小生成树
题目链接: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 —— 最小生成树的更多相关文章
- hdu Constructing Roads (最小生成树)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1102 /************************************************* ...
- HDU 1102 Constructing Roads (最小生成树)
最小生成树模板(嗯……在kuangbin模板里面抄的……) 最小生成树(prim) /** Prim求MST * 耗费矩阵cost[][],标号从0开始,0~n-1 * 返回最小生成树的权值,返回-1 ...
- POJ 2421 Constructing Roads (最小生成树)
Constructing Roads Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- hdu1102 Constructing Roads (简单最小生成树Prim算法)
Problem Description There are N villages, which are numbered from 1 to N, and you should build some ...
- POJ2421 & HDU1102 Constructing Roads(最小生成树)
嘎唔!~又一次POJ过了HDU错了...不禁让我想起前两天的的Is it a tree? orz..这次竟然错在HDU一定要是多组数据输入输出!(无力吐槽TT)..题目很简单,炒鸡水! 题意: 告 ...
- hdu1102 Constructing Roads 基础最小生成树
//克鲁斯卡尔(最小生成树) #include<cstdio> #include<iostream> #include<algorithm> using names ...
- POJ - 2421 Constructing Roads (最小生成树)
There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...
- hdu 1102 Constructing Roads(最小生成树 Prim)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Problem Description There are N villages, which ...
- (step6.1.4)hdu 1102(Constructing Roads——最小生成树)
题目大意:输入一个整数n,表示村庄的数目.在接下来的n行中,每行有n列,表示村庄i到村庄 j 的距离.(下面会结合样例说明).接着,输入一个整数q,表示已经有q条路修好. 在接下来的q行中,会给出修好 ...
随机推荐
- 网络入侵检测规避工具fragrouter
网络入侵检测规避工具fragrouter 网络入侵检测系统可以通过拦截数据包,获取内容进而判断是否为恶意数据包.对于传输较大的数据包,通常会采用分片的方式,将大数据包拆分为小数据包进行传输.如果入 ...
- DNA的复制
半保留复制 DNA分子复制时, DNA分子的双螺旋将解开, 互补的碱基之间的氢键断裂, 解开的两条单链作为复制的模板, 游离的脱氧核苷酸依据碱基互补配对的原则, 通过形成氢键结合到作为模板的单链上. ...
- UIAlertView弹出视图动画效果
在App设计中为了加强用户体验,我们会常常加入一些友好的动画效果.比如类似UIAlertView弹出的动画效果,由于系统中并没有直接提供类似的动画API,如果我们想要做出一样的效果,那就得深入的研究一 ...
- Shadow Map阴影贴图技术之探 【转】
这两天勉勉强强把一个shadowmap的demo做出来了.参考资料多,苦头可不少.Shadow Map技术是目前与Shadow Volume技术并行的传统阴影渲染技术,而且在游戏领域可谓占很大优势.本 ...
- iOS UI08_TableView界面传值
实现两个界面之间内容的传递 // // MainViewController.m // UI08_TableView界面传值 // // Created by dllo on 15/8/7. // C ...
- Go语言阅读小笔记,来自知呼达达关于unsafe.Pointer的分享.
第一式 - 获得Slice和String的内存数据 func stringPointer(s string) unsafe.Pointer { p := (*reflect.StringHeader) ...
- word中更改图片和标题之间的垂直距离
word中插入图片后.往往须要给图片加上标题. 你插入图片和给图片插入标题时,word用的是默认的格式给你插入的图片和标题. 假如原来的paragraph是2倍行距.你的图片和标题之间的距离也是2倍行 ...
- Oracle-31-对视图DML操作
一.对视图进行DML操作 1.创建一个视图v_person create or replace noforceview v_person as select *from person where id ...
- POJ 2309 BST
BST Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8565 Accepted: 5202 Description C ...
- python(31)- 模块练习
1. 小程序:根据用户输入选择可以完成以下功能: 创意文件,如果路径不存在,创建文件夹后再创建文件 能够查看当前路径 在当前目录及其所有子目录下查找文件名包含指定字符串的文件 ...