zoukankan      html  css  js  c++  java
  • Problem 2233 ~APTX4869

    Problem 2233 ~APTX4869

    Accept: 55    Submit: 176
    Time Limit: 1000 mSec    Memory Limit : 32768 KB

    Problem Description

    为了帮助柯南回到一米七四,阿笠博士夜以继日地研究APTX4869的解药。他得出了如下结果:

    1.解药由n种原料构成;

    2.对于两种不同的的原料a,b,它们之间有个影响值f(a,b);

    3.需要把原料分成两个部分X,Y,每部分中至少有一种原料;

    4.解药的效果由分别属于X,Y的原料之间,最小的影响值决定,即

    效果=min{f(a,b)|a∈X,b∈Y)}

    博士需要你帮忙求出:在所有的方案中,最大的效果值可以是多少?

    Input

    多组数据(<=10),处理到EOF。

    每组数据输入第一行为一个正整数n。

    接下去是一个n行n列的整数矩阵,同一行的数以空格隔开。矩阵第i行j列表示第i种和第j种材料的影响值f(i,j)。给出的矩阵是对称的,即f(i,j)=f(j,i)。当i=j时,f(i,i)没有意义,矩阵该处的值为-1。

    2<=n<=800。当i!=j时,0<=f(i,j)<=1000000;当i=j时,f(i,j)=-1。

    Output

    每组数据输出一行,表示最大可能的效果值。

    Sample Input

    3 -1 100 300 100 -1 200 300 200 -1

    Sample Output

    200

    Source

    福州大学第十三届程序设计竞赛
    思路:并查集;
    按照贪心的思路,我们把小的边先合并,在合并小的边时,我们有两种选择,那么就是把两个点分开或合并,所以每当我们找到俩个当前不在一个集合的点,我们更新最小值。
    如果当前两个点以合并,那么continue;
    下面反证:如果在后面已经合并的点要更新最小值,那么,这两点必定通过前面的点相连通,那么必定要断开一些点将这些点加入到相反的集合,也就是比如这两点为x,y,那么x,y必定不能在同一集合,而且有一些开始在x中的点要到y中必定造成,最小值减小,而不会取x,y之间的值。
     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<string.h>
     5 #include<queue>
     6 using namespace std;
     7 int bin[1000];
     8 int shen[1000];
     9 int ju[1000][1000];
    10 typedef struct pp
    11 {
    12         int x;
    13         int y;
    14         int cost;
    15 } ss;
    16 ss aa[1000000];
    17 bool cmp(pp n,pp m)
    18 {
    19         return n.cost<m.cost;
    20 }
    21 int main(void)
    22 {
    23         int i,j,k;
    24         while(scanf("%d",&k)!=EOF)
    25         {
    26                 for(i=0; i<=1000; i++)
    27                 {
    28                         shen[i]=1;
    29                         bin[i]=i;
    30                 }
    31                 for(i=1; i<=k; i++)
    32                 {
    33                         for(j=1; j<=k; j++)
    34                         {
    35                                 scanf("%d",&ju[i][j]);
    36                         }
    37                 }
    38                 int cnt=0;
    39                 for(i=1; i<=k; i++)
    40                 {
    41                         for(j=i+1; j<=k; j++)
    42                         {
    43                                 aa[cnt].cost=ju[i][j];
    44                                 aa[cnt].x=i;
    45                                 aa[cnt].y=j;
    46                                 cnt++;
    47                         }
    48                 }
    49                 sort(aa,aa+cnt,cmp);
    50                 int coutt=0;
    51                 for(i=0; i<cnt; i++)
    52                 {
    53                         int xx;
    54                         int yy;
    55                         for(xx=aa[i].x;xx!=bin[xx];)
    56                             xx=bin[xx];
    57                         for(yy=aa[i].y;yy!=bin[yy];)
    58                             yy=bin[yy];
    59                         if(xx!=yy)
    60                         {
    61                             coutt=aa[i].cost;
    62                             if(shen[xx]>shen[yy])
    63                             {
    64                                 shen[xx]+=shen[yy];
    65                                 bin[yy]=xx;
    66                             }
    67                             else
    68                             {
    69                                 shen[yy]+=shen[xx];
    70                                 bin[xx]=yy;
    71                             }
    72                         }
    73                 }printf("%d
    ",coutt);
    74         }return 0;
    75 }
    油!油!you@
  • 相关阅读:
    【原】 POJ 1308 Is It A Tree? 并查集树结构 解题报告
    终于决定投身Linux怀抱
    Inside the C++ Object Model
    Fedora 下 OpenCV 的安装
    sed 与 awk
    工具链接收藏
    [转] 计算机视觉领域稍微容易中的期刊
    QtCreator开发多文档编辑器(Project 1)
    Fedora 17: Grub Rescue
    做文档类的工作总是让我感到一些烦躁
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5484871.html
Copyright © 2011-2022 走看看