zoukankan      html  css  js  c++  java
  • [poj3723] Conscription

    题意:招募N个男人,M个女人,每个人需要给10000块钱,但是如果跟自己亲密的人被招募了,那么可以少花一些钱,所以每个人的费用为10000-已招募的跟自己亲密度的最大值,求总费用

    题解:

    最大生成树

    最大权森林,呵呵......

    代价为森林的总权值

    由于有重边,所以不能直接选每条边,构出最大生成树即可

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<cmath>
     7 #define ll long long
     8 using namespace std;
     9 
    10 int T,n,m,r,k,ans;
    11 int fa[20010];
    12 
    13 struct Edge {
    14   int x,y,z;
    15   bool operator < (const Edge &a) const {
    16     return z>a.z;
    17   }
    18 }e[50010];
    19 
    20 int gi() {
    21   int x=0,o=1; char ch=getchar();
    22   while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();
    23   if(ch=='-') o=-1,ch=getchar();
    24   while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    25   return o*x;
    26 }
    27 
    28 int find(int x) {
    29   return x==fa[x]?x:fa[x]=find(fa[x]);
    30 }
    31 
    32 int main() {
    33   T=gi();
    34   while(T--) {
    35     n=gi(),m=gi(),r=gi(),k=ans=0;
    36     for(int i=1; i<=r; i++) {
    37       int x=gi()+1,y=gi()+n+1,z=gi();
    38       e[i]=(Edge){x,y,z};
    39     }
    40     n+=m;
    41     sort(e+1,e+r+1);
    42     for(int i=1; i<=n; i++) fa[i]=i;
    43     for(int i=1; i<=r; i++) {
    44       int x=e[i].x,y=e[i].y,xx,yy;
    45       xx=find(x),yy=find(y);
    46       if(xx==yy) continue;
    47       fa[yy]=xx;
    48       ans+=e[i].z,k++;
    49       if(k==n-1) break; 
    50     }
    51     printf("%d
    ", 10000*n-ans);
    52   }
    53   return 0;
    54 }
  • 相关阅读:
    Objective Evaluation Index of image
    MATLAB奔溃仅左上角显示关闭界面X
    论文修改指南之发表
    科研第一步:文献查找和下载
    实习项目1-串口IP升级调试
    FPGA驱动LCD显示红绿蓝彩条
    tw9912配置使用
    BT.656视频信号解码
    色彩空间转换 rgb转ycbcr422/ycbcr422转rgb
    xilinx VDMA IP核使用
  • 原文地址:https://www.cnblogs.com/HLXZZ/p/7576812.html
Copyright © 2011-2022 走看看