• 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 }
  • 相关阅读:
    Robberies HDU 2955
    P1474 货币系统 Money Systems(完全背包)(大水题)
    P1802 5倍经验日(01背包问题,水题)
    1621 花钱买车牌 (暴力一下就非常皮了)
    统计硬币 HDU 2566 (三种解法:线性代数解法,背包解法,奇思妙想解法 >_< )
    P1754 球迷购票问题
    Duwamish模式的Remoting注意事项(Remoting高手可以不必看了)
    Visual source safe 每日备份
    python第一篇
    pycharm的安装和使用
  • 原文地址:https://www.cnblogs.com/symons1992/p/2741231.html
Copyright © 2020-2023  润新知