zoukankan      html  css  js  c++  java
  • SDUT图结构练习——最小生成树

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2144&cid=1186

    这道题一开始是用prim算法做的,一直错一直错,后来问了帅郭改用Kruskal做才对,再后来问了THH和二货才改对的prim算法,是因为重边我没处理啊,上火

     1 #include <cstdio>
     2 #include <cstring>
     3 #include<cstdlib>
     4 #include<iostream>
     5 using namespace std ;
     6 #define oo (1<<28)
     7 const int N = 110 ;
     8 int map[N][N],low[N],flag[N];//low数组是用来保留最小代价的;
     9 //flag数组是用来标记的,找过得点就不再去找
    10 int m,n;
    11 int u,v,w ;
    12 int prim()
    13 {
    14     int i,j,pos,min,ans=0;
    15     memset(flag,0,sizeof(flag));
    16     flag[1]=1;
    17     pos=1;
    18     for(i = 1 ; i <= n ; i++)
    19         if(i != pos)
    20             low[i] = map[pos][i];
    21     for(i = 1 ; i < n ; i++)
    22     {
    23         min=oo;
    24         for(j = 1 ; j <= n ; j++)
    25             if(flag[j] == 0&&min>=low[j])
    26             {
    27                 min = low[j];
    28                 pos = j ;
    29             }
    30         ans += min ;
    31         flag[pos] = 1 ;
    32         for(j = 1 ; j <= n ; j++)
    33             if(flag[j] == 0&&low[j]>map[pos][j])
    34                 low[j]=map[pos][j];
    35     }
    36     return ans;
    37 }
    38 int main()
    39 {
    40     int ans;
    41     while(scanf("%d %d",&n,&m)!=EOF)
    42     {
    43         for(int i = 1 ; i < N ; i++)
    44         {
    45             for(int j = 1 ; j < N ; j++)
    46             {
    47                 map[i][j] = oo ;
    48             }
    49         }
    50         for(int i = 1 ; i <= m ; i++)
    51         {
    52             scanf("%d %d %d",&u,&v,&w);
    53            if(map[u][v] >w)//防止重边出现保留小的重边
    54             map[u][v] = map[v][u] = w ;
    55         }
    56         ans = prim();
    57         printf("%d
    ",ans);
    58     }
    59     return 0;
    60 }
    View Code
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<iostream>
     5 using namespace std ;
     6 const int MAXN = 10000 ;
     7 const int MAX = 100 ;
     8 int EDG[MAX];
     9 int sum;
    10 struct node
    11 {
    12     int u ;
    13     int v ;
    14     int w ;
    15 } map[MAXN],t;
    16 int find(int x)
    17 {
    18     while(x!=EDG[x]){
    19         x=EDG[x];
    20     }
    21     return x;
    22 }
    23 void Kruskal(int x,int y,int z)
    24 {
    25     x = find(x) ;
    26     y = find(y) ;
    27     if(x != y)
    28     {
    29         EDG[x] = y ;
    30         sum += z;
    31     }
    32 }
    33 int main()
    34 {
    35     int n,m,i,j;
    36     while(~scanf("%d %d",&n,&m))
    37     {
    38         sum = 0 ;
    39         int k = 0 ;
    40         for(int i = 1 ; i <= n ; i++)
    41             EDG[i] = i ;
    42         for(int i = 1 ; i <= m ; i++)
    43             scanf("%d %d %d",&map[i].u,&map[i].v,&map[i].w);
    44         for(int i = 1 ; i <= m-1 ; i++){
    45             for(j = i+1 ; j <= m ; j++){
    46                 if(map[i].w > map[j].w)
    47                 {
    48                     t = map[i] ;
    49                     map[i] = map[j];
    50                     map[j] = t ;
    51                 }
    52             }
    53         }
    54         for(int i = 1 ; i <= m ; i++)
    55             Kruskal(map[i].u,map[i].v,map[i].w);
    56             printf("%d
    ",sum);
    57     }
    58     return 0;
    59 }
    View Code
  • 相关阅读:
    一款基于jQuery制作的焦点图片局部场景图片切换的特效
    一款基于jQuery打造的滤镜百叶窗幻灯片特效
    css3实现多种颜色的底部阴影按钮特效
    一款简单的css3打造的一面五星红旗特效
    一款jQuery打造的具有多功能切换的幻灯片特效
    一款jquery打造的特炫酷的全屏上下滚动的jquery焦点图特效
    一款基于jquery打造的全屏切换的焦点图切换特效
    一款运用纯CSS编写的android图标
    datagrid删除确认对话框
    好站好文滙集
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3162666.html
Copyright © 2011-2022 走看看