hdu1102

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

最小生成树(模板题)

3

0 990 692

990 0 179

692 179 0

1

1 2

一共3个村子,下面是第i行j列 i村子和j村子之间建路需要的距离

下面是一个k

代表有k条路已经修好了,1村子和2村子之间以修路

  1 #include<iostream>
  2 #include<math.h>
  3 #include<string.h>
  4 #include<stdlib.h>
  5 #include<stdio.h>
  6 using namespace std;
  7 const int N=5005;
  8 struct stu{
  9     int u;
 10     int v;
 11     int w;
 12 }p[N];
 13 int q[105][105];
 14 int father[N];
 15 int n,m;
 16 int cmp(const void *a,const void *b)
 17 {
 18     return (*(struct stu*)a).w > (*(struct stu*)b).w ?1:-1;
 19 }
 20 int find(int x)
 21 {
 22     if(father[x]!=x)
 23     father[x]=find(father[x]);
 24     return father[x];
 25 }
 26 int make(int a,int b)
 27 {
 28     int h=0;
 29     int f1=find(a);
 30     int f2=find(b);
 31     if(f1>f2)
 32     {
 33         father[f1]=f2;
 34         h=1;
 35     }
 36     else if(f1<f2)
 37     {
 38         father[f2]=f1;
 39         h=1;
 40     }
 41     return h;
 42 }
 43 int kruskal()
 44 {
 45     int cnt=0;
 46     int s=0;
 47     for(int i=0;i<m;i++)
 48     {
 49         if(make(p[i].u,p[i].v))
 50         {
 51             cnt++;
 52             s+=p[i].w;
 53         }
 54         if(cnt==n-1)
 55         return s;
 56     }
 57     return s;
 58 }
 59
 60 int main()
 61 {
 62     //freopen("in.txt","r",stdin);
 63     int k;
 64     while(~scanf("%d",&n))
 65     {
 66         for(int i=1;i<=n;i++)
 67         father[i]=i;
 68         for(int i=1;i<=n;i++)
 69         {
 70             for(int j=1;j<=n;j++)
 71             {
 72                 scanf("%d",&q[i][j]);
 73             }
 74         }
 75         scanf("%d",&k);
 76         int a,b;
 77         while(k--)
 78         {
 79             scanf("%d%d",&a,&b);
 80             q[a][b]=0;//已经建路,清0
 81         }
 82         m=0;
 83         for(int i=1;i<=n;i++)
 84         {
 85             for(int j=i+1;j<=n;j++)
 86             {
 87                 p[m].u=i;
 88                 p[m].v=j;
 89                 p[m++].w=q[i][j];
 90             }
 91         }
 92         qsort(p,m,sizeof(struct stu),cmp);
 93 //        for(int i=0;i<m;i++)
 94 //        {
 95 //            printf("%d %d %d\n",p[i].u,p[i].v,p[i].w);
 96 //        }
 97         printf("%d\n",kruskal());
 98
 99     }
100     return 0;
101 }
时间: 2024-11-07 13:10:13

hdu1102的相关文章

【HDU1102】Constructing Roads(MST基础题)

最小生成树水题.prim一次AC 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cctype> 6 #include <cmath> 7 #include <algorithm> 8 #include <numeric> 9 10 #define typec int

POJ 2485 Highways &amp;&amp; HDU1102(20/200)

题目链接:Highways 没看题,看了输入输出,就有种似曾相识的感觉,果然和HDU1102 题相似度99%,但是也遇到一坑 cin输入竟然TLE,cin的缓存不至于这么狠吧,题目很水,矩阵已经告诉你了,就敲个模板就是了,5分钟,1A 题意就是打印,最小生成树的最大边权,改了改输入,水过 这个题完了,我的个人POJ计划进度以完成 20/200,这其中主要是图论的题,等下周把POJ计划图论的题目打完,就回头打模拟!我就不信还能比图论难 #include <iostream> #include &

POJ2421 &amp; HDU1102 Constructing Roads(最小生成树)

嘎唔!~又一次POJ过了HDU错了...不禁让我想起前两天的的Is it a tree?   orz..这次竟然错在HDU一定要是多组数据输入输出!(无力吐槽TT)..题目很简单,炒鸡水! 题意: 告诉你每个村庄之间的距离,和几组已经联通的村庄,求使所有村庄联通所要建的道路的最短距离. 很简单,用最小生成树的Prim算法,相当于邻接矩阵已知,把已联通的村庄之间的距离改为零即可. 附上AC代码: 1 #include <stdio.h> 2 #include <string.h> 3

HDU1102 Constructing Roads 【最小生成树Prim】

Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13756    Accepted Submission(s): 5223 Problem Description There are N villages, which are numbered from 1 to N, and you should

hdu1102 Constructing Roads 基础最小生成树

1 //克鲁斯卡尔(最小生成树) 2 #include<cstdio> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn = 100005; 8 int n, t; 9 struct node 10 { 11 int bagin, end, len; 12 }arr[maxn]; 13 int fa[maxn]; 14 15 void init() 1

HDU1102 最小生成树prim算法

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 题意:给出任意两个城市之间建一条路的时间,给出哪些城市之间已经建好,问最少还要多少时间使所有的城市连通? 思路:已经建好的城市之间需要的时间设为0,就是求最小生成树的权值和了. 顺便复习一下prim算法. 知道思想就可以实现,才是合格的搬砖工,希望以后脱离模板. 附代码: /* prim 最小生成树算法 过程:prim算法将图分为两部分,假设原顶点集为V,将其分为S和V-S两部分,S为已经确定

hdu1102(最小生成树)

题意为将所有点连起来,但是有些边已经帮你连好了,要求你将剩下的连起来形成最小生成树. 因为一些点已经连起来了,所以应该选用kruskal算法.虽然这道题的图是按照邻接矩阵给出的,但选用prim算法的话,实现起来反而不容易还容易出错,倒不如自己对输入进行一些加工,然后选取kruskal算法. #include <iostream> #include <stdio.h> #include <queue> using namespace std; int input[105]

HDU1102 Constructing Roads【Prim】

Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14897    Accepted Submission(s): 5677 Problem Description There are N villages, which are numbered from 1 to N, and you should

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

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