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\n",coutt);
74         }return 0;
75 }

 

转载于:https://www.cnblogs.com/zzuli2sjy/p/5484871.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值