zoukankan      html  css  js  c++  java
  • poj 1258 AgriNet 最小生成树

    这题跟上一个题是一样的。就出所有最小生成树的所有边的值就可以了。

    直接代码吧。

      1 #include <stdio.h>
      2 #include <algorithm>
      3 #include <iostream>
      4 #include <string.h>
      5 #define MAXN 10000
      6 #define MAXM 50000
      7 using namespace std;
      8 int point[500+10][500+10];
      9 struct edge
     10 {
     11     int u,v,w;
     12 } edges[MAXM];
     13 int parent[MAXN];
     14 int n,m;
     15 int i,j;
     16 int maxx;
     17 
     18 //并查集
     19 void UFset()
     20 {
     21 
     22     for(i=1; i<=n; i++)
     23         parent[i]=-1;
     24 }
     25 int Find(int x)
     26 {
     27     int s;
     28     for(s=x; parent[s]>=0; s=parent[s])  ;
     29     while(s!=x)
     30     {
     31         int tmp=parent[x];
     32         parent[x]=s;
     33         x=tmp;
     34     }
     35     return s;
     36 }
     37 void Union(int R1,int R2)
     38 {
     39     int r1=Find(R1),r2=Find(R2);
     40     int tmp=parent[r1]+parent[r2];
     41     if(parent[r1]>parent[r2])
     42     {
     43         parent[r1]=r2;
     44         parent[r2]=tmp;
     45     }
     46     else
     47     {
     48         parent[r2]=r1;
     49         parent[r1]=tmp;
     50     }
     51     return;
     52 }
     53 //并查集
     54 bool cmp(edge a,edge b)
     55 {
     56     return a.w<b.w;
     57 }
     58 void Kruskal()
     59 {
     60     maxx=0;
     61     int sumweight=0;
     62     int num=0;
     63     int u,v;
     64     UFset();
     65     for(i=0; i<m; ++i)
     66     {
     67         u=edges[i].u;
     68         v=edges[i].v;
     69         if(Find(u)!=Find(v))
     70         {
     71             if(edges[i].w>maxx) maxx=edges[i].w;
     72             sumweight+=edges[i].w;
     73             ++num;
     74             Union(u,v);
     75         }
     76     }
     77     printf("%d\n",sumweight);
     78 }
     79 
     80 int main()
     81 {
     82     int t,count;
     83     while(scanf("%d",&n)!=EOF)
     84     {
     85         memset(point,0,sizeof(point));
     86 
     87 
     88 
     89         for(i=0; i<n; ++i)
     90             for(j=0; j<n; ++j)
     91             {
     92                 scanf("%d",&point[i][j]);
     93                 if(point[i][j]==0) point[i][j]=1000000000;
     94             }
     95         m=0;
     96         for(i=0; i<n; ++i)
     97             for(j=0; j<=i; ++j)
     98             {
     99                 if(i==j) continue;
    100                 edges[m].u=i+1;
    101                 edges[m].v=j+1;
    102                 edges[m].w=point[i][j];
    103                 m++;
    104             }
    105         sort(edges,edges+m,cmp);
    106         Kruskal();
    107 
    108     }
    109     return 0;
    110 }
  • 相关阅读:
    动手动脑感想
    原码反码补码
    java测试感想
    报告
    假期报告
    假期报告
    java学习进度
    《大道至简》读后感
    2020/1/31 PHP代码审计之目录穿越漏洞
    [极客大挑战 2019]BabySQL
  • 原文地址:https://www.cnblogs.com/symons1992/p/2741231.html
Copyright © 2011-2022 走看看