关闭

hdu1102 Constructing Roads (最小生成树,kruskal)

标签: hdu1102Constructing Roads最小生成树kruskal
274人阅读 评论(0) 收藏 举报
分类:

Constructing Roads

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18127    Accepted Submission(s): 6907


Problem Description
There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two village A and B are connected, if and only if there is a road between A and B, or there exists a village C such that there is a road between A and C, and C and B are connected. 

We know that there are already some roads between some villages and your job is the build some roads such that all the villages are connect and the length of all the roads built is minimum.
 

Input
The first line is an integer N (3 <= N <= 100), which is the number of villages. Then come N lines, the i-th of which contains N integers, and the j-th of these N integers is the distance (the distance should be an integer within [1, 1000]) between village i and village j.

Then there is an integer Q (0 <= Q <= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 <= a < b <= N), which means the road between village a and village b has been built.
 

Output
You should output a line contains an integer, which is the length of all the roads to be built such that all the villages are connected, and this value is minimum. 
 

Sample Input
3 0 990 692 990 0 179 692 179 0 1 1 2
 

Sample Output
179
 

Source
 

Recommend
Eddy   |   We have carefully selected several similar problems for you:  1233 1301 1162 1232 1875 
 


代码:

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn=1e2;
int f[maxn*maxn+10];
struct edge{
	int u,v,w;
}e[maxn*maxn+10];

bool cmp_e(edge a,edge b)
{
  return a.w<b.w;
}

int find(int x)
{
  if(f[x]==x)return x;
  return f[x]=find(f[x]);
}

int main()
{
  //freopen("1.in","r",stdin);
  
  int n,i,j,k,s,x,y,ans;
  while(scanf("%d",&n)==1)
    {
      for(s=0,i=1;i<=n;i++)
        for(j=1;j<=n;j++)
          {
            scanf("%d",&k);
            if(i<j)e[++s].u=i,e[s].v=j,e[s].w=k;
		  }
	  for(i=1;i<=n;i++)f[i]=i;
	  sort(e+1,e+s+1,cmp_e);
	  scanf("%d",&n);
	  for(i=1;i<=n;i++)
	    {
	      scanf("%d%d",&x,&y);
	      f[find(x)]=find(y);
		}
	  for(ans=0,i=1;i<=s;i++)
	    {
	      x=find(e[i].u),y=find(e[i].v);
	      if(x!=y)f[x]=y,ans+=e[i].w;
		}
	  printf("%d\n",ans);
	}
  return 0;
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

POJ-2421-Constructing Roads(最小生成树 普利姆)

D - Constructing Roads Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u...
  • qq_32680617
  • qq_32680617
  • 2016-05-21 19:43
  • 313

最小生成树之Kruskal算法

给定一个无向图,如果它任意两个顶点都联通并且是一棵树,那么我们就称之为生成树(Spanning Tree)。如果是带权值的无向图,那么权值之和最小的生成树,我们就称之为最小生成树(MST, Minim...
  • luomingjun12315
  • luomingjun12315
  • 2015-08-18 08:12
  • 26121

最小生成树-kruskal算法

Kruskal算法按照边的权重大小处理,每一次从待选边中选出最小的边,企图加入到生成树当中。但此时存在一个问题,若当前边加入生成树后存在环路,则该边废弃。一直重复这一过程,直到所有的点都已经加入生成树...
  • turingwy
  • turingwy
  • 2016-02-19 15:36
  • 1472

最小生成树Kruskal算法朴素版 C语言实现

最小生成树Kruskal算法朴素版 C语言实现
  • sunshineacm
  • sunshineacm
  • 2017-12-11 22:15
  • 78

数据结构:最小生成树--Kruskal算法

Kruskal算法 求解最小生成树的另一种常见算法是Kruskal算法,它比Prim算法更直观。从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条边不能使已有...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014-08-07 11:45
  • 5021

Kruskal算法(贪心+并查集=最小生成树)

http://www.51nod.com/ Kruskal算法的高效实现需要一种称作并查集的结构。我们在这里不介绍并查集,只介绍Kruskal算法的基本思想和证明,实现留在以后讨论。 Krusk...
  • liangzhaoyang1
  • liangzhaoyang1
  • 2016-04-16 17:34
  • 7204

贪婪算法-最小生成树-Kruskal算法

最小生成树是找出图中包括所有结点的联通子图,使得其所有的边的权重之和最小。 Kruskal 算法提供一种在 O(ElogV) 运行时间确定最小生成树的方案。其选择的贪心策略就是,每次都选择权重最小...
  • u010726042
  • u010726042
  • 2016-04-10 21:47
  • 669

生成树和最小费用生成树以及Kruskal算法

Spanning Tree --生成树    生成树是一种特殊通路,在实际应用中具有广泛意义。 比如:将道路网表示一个图,则生成树就表示从某地出发,到达所有其他各地且不绕圈子的直达路径,就是不经过同一...
  • leaf_130
  • leaf_130
  • 2016-02-15 15:15
  • 624

Prim算法和Kruskal算法构造最小生成树

最小生成树 首先,生成树是建立在无向图中的,对于有向图,则没有生成树的概念,所以接下来讨论的图均默认为无向图。对于一个有n个点的图,最少需要n-1条边使得这n个点联通,由这n-1条边组成的子图则称为...
  • qq_18230813
  • qq_18230813
  • 2015-07-31 23:19
  • 1048

最小生成树之Kruskal和Prim算法——C++实现

很久以前就学过最小生成树之Kruskal和Prim算法,这两个算法很容易理解,但实现起来并不那么容易。最近学习了并查集算法,得知并查集可以用于实现上述两个算法后,我自己动手实现了最小生成树算法。 宏观...
  • lrgdongnan
  • lrgdongnan
  • 2016-06-18 17:16
  • 3899
    个人资料
    • 访问:271198次
    • 积分:6262
    • 等级:
    • 排名:第4567名
    • 原创:353篇
    • 转载:59篇
    • 译文:0篇
    • 评论:26条
    最新评论