树的专题整理(二)

来源:互联网 发布:mysql enum创建 编辑:程序博客网 时间:2024/05/16 00:24

1、POJ 2485

题目与分析:

这道题抽象一下:“是求最小生成树的最大边”


2)使用kruscal算法来解决

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  * POJ_2485_kruscal.cpp 
  3.  * 
  4.  *  Created on: 2014年6月11日 
  5.  *      Author: Administrator 
  6.  */  
  7.   
  8. #include <iostream>  
  9. #include <cstdio>  
  10. #include <algorithm>  
  11.   
  12. using namespace std;  
  13.   
  14. const int maxn = 505;  
  15. const int maxm = maxn*maxn;  
  16. const int inf = 9999999;  
  17.   
  18. int map[maxn][maxn];  
  19. int father[maxn];  
  20. int find(int x) {  
  21.     if (x == father[x]) {  
  22.         return x;  
  23.     }  
  24.   
  25.     father[x] = find(father[x]);  
  26.     return father[x];  
  27. }  
  28.   
  29. void merge(int x, int y) {  
  30.     int fx = find(x);  
  31.     int fy = find(y);  
  32.   
  33.     if (fx != fy) {  
  34.         father[fx] = fy;  
  35.     }  
  36. }  
  37.   
  38.   
  39. struct Edge{  
  40.     int begin;  
  41.     int end;  
  42.     int weight;  
  43.     int selected;  
  44. }edge[maxm];  
  45.   
  46. bool cmp(Edge a,Edge b){  
  47.     if(a.weight != b.weight){  
  48.         return a.weight < b.weight;  
  49.     }  
  50.   
  51.     if(a.begin < b.begin){  
  52.         return a.begin < b.begin;  
  53.     }  
  54.   
  55.     return a.end < b.end;  
  56. }  
  57.   
  58. int n,m;  
  59.   
  60. int maxe;  
  61.   
  62. int kruscal(){  
  63.     int sum = 0;  
  64.   
  65.     int i;  
  66.     for(i = 1 ; i <= n ; ++i){  
  67.         father[i] = i;  
  68.     }  
  69.   
  70.     sort(edge+1,edge+1+m,cmp);  
  71.   
  72.     int k = 0;  
  73.     for(i = 1 ; i <= m ; ++i){  
  74.         if( k == n-1){  
  75.             break;  
  76.         }  
  77.   
  78.         int x = find(edge[i].begin);  
  79.         int y = find(edge[i].end);  
  80.         if(x != y){  
  81.             merge(x,y);  
  82.             k++;  
  83.             edge[i].selected = true;  
  84.   
  85.             sum += edge[i].weight;  
  86.   
  87.             maxe = edge[i].weight;//用来记录最下生成树中当前的最大边  
  88.         }  
  89.     }  
  90.   
  91.     return sum;  
  92. }  
  93.   
  94.   
  95. int main(){  
  96.     int t;  
  97.     scanf("%d",&t);  
  98.   
  99.     while(t--){  
  100.         scanf("%d",&n);  
  101.         m = 1;  
  102.   
  103.         int i;  
  104.         int j;  
  105.         for(i = 1 ; i <= n ; ++i){  
  106.             for(j = 1 ; j <= n ; ++j){  
  107.                 scanf("%d",&map[i][j]);  
  108.             }  
  109.         }  
  110.   
  111.   
  112.         for(i = 1 ; i <= n ; ++i){  
  113.             for(j = i+1; j <= n ; ++j){  
  114.                 edge[m].begin = i;  
  115.                 edge[m].end = j;  
  116.                 edge[m].weight = map[i][j];  
  117.                 edge[m++].selected = false;  
  118.             }  
  119.         }  
  120.   
  121.         kruscal();  
  122.   
  123.   
  124.   
  125.         printf("%d\n",maxe);  
  126.   
  127.     }  
  128.   
  129.     return 0;  
  130. }  







0 0
原创粉丝点击