poj 1251  && hdu 1301

Sample Input

9 //n 结点数
A 2 B 12 I 25
B 3 C 10 H 40 I 8
C 2 D 18 G 55
D 1 E 44
E 2 F 60 G 38
F 0
G 1 H 35
H 1 I 35
3
A 2 B 10 C 40
B 1 C 20
0
Sample Output

216
30

prim算法

  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cstring>
  4. # include <algorithm>
  5. # include <cmath>
  6. # define LL long long
  7. using namespace std ;
  8.  
  9. const int INF=0x3f3f3f3f;
  10. const int MAXN=;
  11. bool vis[MAXN];
  12. int lowc[MAXN];
  13. int n ;
  14. int cost[MAXN][MAXN] ;
  15.  
  16. int Prim()//点是0~n-1
  17. {
  18. int ans=;
  19. memset(vis,false,sizeof(vis));
  20. vis[]=true;
  21. for(int i=;i<n;i++)lowc[i]=cost[][i];
  22. for(int i=;i<n;i++)
  23. {
  24. int minc=INF;
  25. int p=-;
  26. for(int j=;j<n;j++)
  27. if(!vis[j]&&minc>lowc[j])
  28. {
  29. minc=lowc[j];
  30. p=j;
  31. }
  32. if(minc==INF)return -;//原图不连通
  33. ans+=minc;
  34. vis[p]=true;
  35. for(int j=;j<n;j++)
  36. if(!vis[j]&&lowc[j]>cost[p][j])
  37. lowc[j]=cost[p][j];
  38. }
  39. return ans;
  40. }
  41.  
  42. int main()
  43. {
  44.  
  45. // freopen("in.txt","r",stdin) ;
  46. while(cin>>n)
  47. {
  48. if (n == )
  49. break ;
  50. char u , v;
  51. int w , num ;
  52. int i , j ;
  53. for (i = ; i < n ; i++)
  54. for (j = ; j < n ; j++)
  55. cost[i][j] = INF ;
  56.  
  57. for (i = ; i < n ; i++)
  58. {
  59. cin>>u>>num ;
  60. while (num--)
  61. {
  62. cin>>v>>w ;
  63. cost[u -'A'][v - 'A'] = w ;
  64. cost[v - 'A'][u -'A'] = w ;
  65. }
  66. }
  67. cout<<Prim()<<endl ;
  68.  
  69. }
  70. return ;
  71. }

Kruskal算法

  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cstring>
  4. # include <algorithm>
  5. # include <cmath>
  6. # define LL long long
  7. using namespace std ;
  8.  
  9. int n ;
  10. const int MAXN=;//最大点数
  11. const int MAXM=;//最大边数
  12. int F[MAXN];//并查集使用
  13. struct Edge
  14. {
  15. int u,v,w;
  16. }edge[MAXM];//存储边的信息,包括起点/终点/权值
  17.  
  18. int tol;//边数,加边前赋值为0
  19. void addedge(int u,int v,int w)
  20. {
  21.  
  22. edge[tol].u=u;
  23. edge[tol].v=v;
  24. edge[tol++].w=w;
  25. }
  26. bool cmp(Edge a,Edge b)
  27. {//排序函数,讲边按照权值从小到大排序
  28. return a.w<b.w;
  29. }
  30. int find(int x)
  31. {
  32. if(F[x]==-)return x;
  33. else return F[x]=find(F[x]);
  34. }
  35. int Kruskal()//传入点数,返回最小生成树的权值,如果不连通返回-1
  36. {
  37. memset(F,-,sizeof(F));
  38. sort(edge,edge+tol,cmp);
  39. int cnt=;//计算加入的边数
  40. int ans=;
  41. for(int i=;i<tol;i++)
  42. {
  43. int u=edge[i].u;
  44. int v=edge[i].v;
  45. int w=edge[i].w;
  46. int t1=find(u);
  47. int t2=find(v);
  48. if(t1!=t2)
  49. {
  50. ans+=w;
  51. F[t1]=t2;
  52. cnt++;
  53. }
  54. if(cnt==n-)break;
  55. }
  56. if(cnt<n-)return -;//不连通
  57. else return ans;
  58. }
  59.  
  60. int main()
  61. {
  62.  
  63. // freopen("in.txt","r",stdin) ;
  64. while(cin>>n)
  65. {
  66. if (n == )
  67. break ;
  68. char u , v;
  69. int w , num ;
  70. int i , j ;
  71. tol = ;
  72. for (i = ; i < n ; i++)
  73. {
  74. cin>>u>>num ;
  75. while (num--)
  76. {
  77. cin>>v>>w ;
  78. addedge(u,v,w) ;
  79. }
  80. }
  81. cout<<Kruskal()<<endl ;
  82.  
  83. }
  84. return ;
  85. }

poj 1258

Sample Input

4 //n
0 4 9 21 //邻接矩阵
4 0 8 17
9 8 0 16
21 17 16 0
Sample Output

28

prim

  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cstring>
  4. # include <algorithm>
  5. # include <cmath>
  6. # define LL long long
  7. using namespace std ;
  8.  
  9. const int INF=0x3f3f3f3f;
  10. const int MAXN=;
  11. bool vis[MAXN];
  12. int lowc[MAXN];
  13. int n ;
  14. int cost[MAXN][MAXN] ;
  15.  
  16. int Prim()//点是0~n-1
  17. {
  18. int ans=;
  19. memset(vis,false,sizeof(vis));
  20. vis[]=true;
  21. for(int i=;i<n;i++)lowc[i]=cost[][i];
  22. for(int i=;i<n;i++)
  23. {
  24. int minc=INF;
  25. int p=-;
  26. for(int j=;j<n;j++)
  27. if(!vis[j]&&minc>lowc[j])
  28. {
  29. minc=lowc[j];
  30. p=j;
  31. }
  32. if(minc==INF)return -;//原图不连通
  33. ans+=minc;
  34. vis[p]=true;
  35. for(int j=;j<n;j++)
  36. if(!vis[j]&&lowc[j]>cost[p][j])
  37. lowc[j]=cost[p][j];
  38. }
  39. return ans;
  40. }
  41.  
  42. int main()
  43. {
  44.  
  45. //freopen("in.txt","r",stdin) ;
  46. while(cin>>n)
  47. {
  48. int w ;
  49. int i , j ;
  50. for (i = ; i < n ; i++)
  51. for (j = ; j < n ; j++)
  52. {
  53. cin>>w ;
  54. if(w==)
  55. cost[i][j] = INF ;
  56. else
  57. cost[i][j] = w ;
  58. }
  59. cout<<Prim()<<endl ;
  60.  
  61. }
  62. return ;
  63. }

hdu 1863

Sample Input
3 3 //边数 结点数
1 2 1 //一条边两边结点的id 边的权值
1 3 2
2 3 4
1 3
2 3 2
0 100

Sample Output
3
? //不连通就输出这个

Kruskal

  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cstring>
  4. # include <algorithm>
  5. # include <cmath>
  6. # define LL long long
  7. using namespace std ;
  8.  
  9. int n ;
  10. const int MAXN=;//最大点数
  11. const int MAXM=;//最大边数
  12. int F[MAXN];//并查集使用
  13. struct Edge
  14. {
  15. int u,v,w;
  16. }edge[MAXM];//存储边的信息,包括起点/终点/权值
  17.  
  18. int tol;//边数,加边前赋值为0
  19. void addedge(int u,int v,int w)
  20. {
  21.  
  22. edge[tol].u=u;
  23. edge[tol].v=v;
  24. edge[tol++].w=w;
  25. }
  26. bool cmp(Edge a,Edge b)
  27. {//排序函数,讲边按照权值从小到大排序
  28. return a.w<b.w;
  29. }
  30. int find(int x)
  31. {
  32. if(F[x]==-)return x;
  33. else return F[x]=find(F[x]);
  34. }
  35. int Kruskal()//传入点数,返回最小生成树的权值,如果不连通返回-1
  36. {
  37. memset(F,-,sizeof(F));
  38. sort(edge,edge+tol,cmp);
  39. int cnt=;//计算加入的边数
  40. int ans=;
  41. for(int i=;i<tol;i++)
  42. {
  43. int u=edge[i].u;
  44. int v=edge[i].v;
  45. int w=edge[i].w;
  46. int t1=find(u);
  47. int t2=find(v);
  48. if(t1!=t2)
  49. {
  50. ans+=w;
  51. F[t1]=t2;
  52. cnt++;
  53. }
  54. if(cnt==n-)break;
  55. }
  56. if(cnt<n-)return -;//不连通
  57. else return ans;
  58. }
  59.  
  60. int main()
  61. {
  62.  
  63. // freopen("in.txt","r",stdin) ;
  64. int m ;
  65. while(scanf("%d %d" , &m , &n) != EOF)
  66. {
  67. if (m == )
  68. break ;
  69. int i ;
  70. int u , v , w ;
  71. tol = ;
  72. while(m--)
  73. {
  74. scanf("%d %d %d" , &u , &v , &w) ;
  75. addedge(u , v , w) ;
  76. }
  77. int k = Kruskal() ;
  78. if (k == -)
  79. printf("?\n") ;
  80. else
  81. printf("%d\n" , k) ;
  82.  
  83. }
  84. return ;
  85. }

poj 1287

Sample Input
1 0

2 3 //结点 边
1 2 37//u v w
2 1 17
1 2 68

3 7
1 2 19
2 3 11
3 1 7
1 3 5
2 3 89
3 1 91
1 2 32

5 7
1 2 5
2 3 7
2 4 8
4 5 11
3 5 10
1 5 6
4 2 12

0

Sample Output

0
17
16
26

Kruskal

  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cstring>
  4. # include <algorithm>
  5. # include <cmath>
  6. # define LL long long
  7. using namespace std ;
  8.  
  9. int n ;
  10. const int MAXN=;//最大点数
  11. const int MAXM=;//最大边数
  12. int F[MAXN];//并查集使用
  13. struct Edge
  14. {
  15. int u,v,w;
  16. }edge[MAXM];//存储边的信息,包括起点/终点/权值
  17.  
  18. int tol;//边数,加边前赋值为0
  19. void addedge(int u,int v,int w)
  20. {
  21.  
  22. edge[tol].u=u;
  23. edge[tol].v=v;
  24. edge[tol++].w=w;
  25. }
  26. bool cmp(Edge a,Edge b)
  27. {//排序函数,讲边按照权值从小到大排序
  28. return a.w<b.w;
  29. }
  30. int find(int x)
  31. {
  32. if(F[x]==-)return x;
  33. else return F[x]=find(F[x]);
  34. }
  35. int Kruskal()//传入点数,返回最小生成树的权值,如果不连通返回-1
  36. {
  37. memset(F,-,sizeof(F));
  38. sort(edge,edge+tol,cmp);
  39. int cnt=;//计算加入的边数
  40. int ans=;
  41. for(int i=;i<tol;i++)
  42. {
  43. int u=edge[i].u;
  44. int v=edge[i].v;
  45. int w=edge[i].w;
  46. int t1=find(u);
  47. int t2=find(v);
  48. if(t1!=t2)
  49. {
  50. ans+=w;
  51. F[t1]=t2;
  52. cnt++;
  53. }
  54. if(cnt==n-)break;
  55. }
  56. if(cnt<n-)return -;//不连通
  57. else return ans;
  58. }
  59.  
  60. int main()
  61. {
  62.  
  63. //freopen("in.txt","r",stdin) ;
  64. int m ;
  65. while(scanf("%d %d" , &n , &m) != EOF)
  66. {
  67. if (n == )
  68. break ;
  69. int i ;
  70. int u , v , w ;
  71. tol = ;
  72. if (n == && m == )
  73. {
  74. printf("0\n") ;
  75. continue ;
  76. }
  77. while(m--)
  78. {
  79. scanf("%d %d %d" , &u , &v , &w) ;
  80. addedge(u , v , w) ;
  81. }
  82. printf("%d\n" , Kruskal()) ;
  83.  
  84. }
  85. return ;
  86. }

poj 2421

有的路已建 建好了的路权值设为0

Sample Input

3 // n
0 990 692 //邻接矩阵
990 0 179
692 179 0
1 //m
1 2 // u v
Sample Output

179

prim

  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cstring>
  4. # include <algorithm>
  5. # include <cmath>
  6. # define LL long long
  7. using namespace std ;
  8.  
  9. const int INF=0x3f3f3f3f;
  10. const int MAXN=;
  11. bool vis[MAXN];
  12. int lowc[MAXN];
  13. int n ;
  14. int cost[MAXN][MAXN] ;
  15.  
  16. int Prim()//点是0~n-1
  17. {
  18. int ans=;
  19. memset(vis,false,sizeof(vis));
  20. vis[]=true;
  21. for(int i=;i<n;i++)lowc[i]=cost[][i];
  22. for(int i=;i<n;i++)
  23. {
  24. int minc=INF;
  25. int p=-;
  26. for(int j=;j<n;j++)
  27. if(!vis[j]&&minc>lowc[j])
  28. {
  29. minc=lowc[j];
  30. p=j;
  31. }
  32. if(minc==INF)return -;//原图不连通
  33. ans+=minc;
  34. vis[p]=true;
  35. for(int j=;j<n;j++)
  36. if(!vis[j]&&lowc[j]>cost[p][j])
  37. lowc[j]=cost[p][j];
  38. }
  39. return ans;
  40. }
  41.  
  42. int main()
  43. {
  44.  
  45. // freopen("in.txt","r",stdin) ;
  46. while(cin>>n)
  47. {
  48. int w ;
  49. int i , j ;
  50. for (i = ; i < n ; i++)
  51. for (j = ; j < n ; j++)
  52. {
  53. cin>>w ;
  54. if(w==)
  55. cost[i][j] = INF ;
  56. else
  57. cost[i][j] = w ;
  58. }
  59. int m ;
  60. cin>>m ;
  61. while(m--)
  62. {
  63. int x , y ;
  64. cin>>x>>y ;
  65. cost[x-][y-] = ;
  66. cost[y-][x-] = ;
  67. }
  68. cout<<Prim()<<endl ;
  69.  
  70. }
  71. return ;
  72. }

hdu 1233

n*(n-1)/2条边
Sample Input
3 //n
1 2 1 //u v w
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0

Sample Output
3
5

Kruskal

  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cstring>
  4. # include <algorithm>
  5. # include <cmath>
  6. # define LL long long
  7. using namespace std ;
  8.  
  9. int n ;
  10. const int MAXN=;//最大点数
  11. const int MAXM=;//最大边数
  12. int F[MAXN];//并查集使用
  13. struct Edge
  14. {
  15. int u,v,w;
  16. }edge[MAXM];//存储边的信息,包括起点/终点/权值
  17.  
  18. int tol;//边数,加边前赋值为0
  19. void addedge(int u,int v,int w)
  20. {
  21.  
  22. edge[tol].u=u;
  23. edge[tol].v=v;
  24. edge[tol++].w=w;
  25. }
  26. bool cmp(Edge a,Edge b)
  27. {//排序函数,讲边按照权值从小到大排序
  28. return a.w<b.w;
  29. }
  30. int find(int x)
  31. {
  32. if(F[x]==-)return x;
  33. else return F[x]=find(F[x]);
  34. }
  35. int Kruskal()//传入点数,返回最小生成树的权值,如果不连通返回-1
  36. {
  37. memset(F,-,sizeof(F));
  38. sort(edge,edge+tol,cmp);
  39. int cnt=;//计算加入的边数
  40. int ans=;
  41. for(int i=;i<tol;i++)
  42. {
  43. int u=edge[i].u;
  44. int v=edge[i].v;
  45. int w=edge[i].w;
  46. int t1=find(u);
  47. int t2=find(v);
  48. if(t1!=t2)
  49. {
  50. ans+=w;
  51. F[t1]=t2;
  52. cnt++;
  53. }
  54. if(cnt==n-)break;
  55. }
  56. if(cnt<n-)return -;//不连通
  57. else return ans;
  58. }
  59.  
  60. int main()
  61. {
  62.  
  63. // freopen("in.txt","r",stdin) ;
  64. while(scanf("%d" , &n) != EOF)
  65. {
  66. if (n == )
  67. break ;
  68. int i ;
  69. int u , v , w ;
  70. tol = ;
  71.  
  72. for (i = ; i <= (n-)*n/ ; i++)
  73. {
  74. scanf("%d %d %d" , &u , &v , &w) ;
  75. addedge(u , v , w) ;
  76. }
  77. printf("%d\n" , Kruskal()) ;
  78.  
  79. }
  80. return ;
  81. }

poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题的更多相关文章

  1. HDU 1233 最小生成树模板题,练练模板

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. POJ 1287 Networking (最小生成树模板题)

    Description You are assigned to design network connections between certain points in a wide area. Yo ...

  3. POJ 1258:Agri-Net Prim最小生成树模板题

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45050   Accepted: 18479 Descri ...

  4. 最小生成树模板题POJ - 1287-prim+kruskal

    POJ - 1287超级模板题 大概意思就是点的编号从1到N,会给你m条边,可能两个点之间有多条边这种情况,求最小生成树总长度? 这题就不解释了,总结就算,prim是类似dijkstra,从第一个点出 ...

  5. POJ 1789 Truck History【最小生成树模板题Kruscal】

    题目链接:http://poj.org/problem?id=1789 大意: 不同字符串相同位置上不同字符的数目和是它们之间的差距.求衍生出全部字符串的最小差距. #include<stdio ...

  6. POJ 2289 Jamie's Contact Groups 【二分】+【多重匹配】(模板题)

    <题目链接> 题目大意: 有n个人,每个人都有一个或者几个能够归属的分类,将这些人分类到他们能够归属的分类中后,使所含人数最多的分类值最小,求出该分类的所含人数值. 解题分析: 看到求最大 ...

  7. POJ - 1330 Nearest Common Ancestors 最近公共祖先+链式前向星 模板题

    A rooted tree is a well-known data structure in computer science and engineering. An example is show ...

  8. POJ 1789 Truck History (Kruskal最小生成树) 模板题

    Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for v ...

  9. HDU 1863 畅通工程(Prim,Kruskal,邻接表模板)

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. string字符串js操作

    String 对象方法 方法 描述 anchor() 创建 HTML 锚. big() 用大号字体显示字符串. blink() 显示闪动字符串. bold() 使用粗体显示字符串. charAt() ...

  2. 阿里云3台机器组成集群配置ssh免密码登陆

    1 查询阿里云局网ip 注意:需要配置同一地区同一可用区的机器 才是一个局网 2 配置好hosts文件 3 hostname确认也是正确的 4 生成公钥私钥 三台机器同样操作 ssh-keygen - ...

  3. <video>标签:视频播放器动态设置src

    HTML代码 <div  id="my_div">    <video id="my_video"  width="600" ...

  4. Synchronized和lock的区别和用法

    一.synchronized和lock的用法区别 (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要 ...

  5. 公共模块定义/草案(Common Module Definition / draft - CMD草案)

    This specification addresses how modules should be written in order to be interoperable in browser-b ...

  6. python 数据类型详解

    python数据类型详解 参考网址:http://www.cnblogs.com/linjiqin/p/3608541.html 目录1.字符串2.布尔类型3.整数4.浮点数5.数字6.列表7.元组8 ...

  7. 【学习博客】Python学习初体验

    本周是正式开始学习Python的第一周.很久不写代码了,毕业第5年了,期间几乎没怎么动过手.这段时间比较规律.密集的学习又让我找回了当时的感觉,还不算陌生,我挺喜欢的这种能实实在在看到自己知识增长的状 ...

  8. Python模块学习 - fnmatch & glob

    介绍 fnmatch 和 glob 模块都是用来做字符串匹配文件名的标准库. fnmatch模块 大部分情况下使用字符串匹配查找特定的文件就能满足需求,如果需要更加灵活的字符串匹配,就没有办法了,这里 ...

  9. Pycharm 字体大小调整

    Pycharm 字体大小调整 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/awyyauqpmy/article/details/79334496P ...

  10. diff命令的参数详解和实例 【转】

    转自:http://blog.chinaunix.net/uid-25324849-id-270254.html diff命令参数: diff - 找出两个文件的不同点 总览 diff [选项] 源文 ...