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 }
时间: 2024-11-10 11:36:02

Problem 2233 ~APTX4869的相关文章

FZu Problem 2233 ~APTX4869 (并查集 + sort)

题目链接: FZu Problem 2233 ~APTX4869 题目描述: 给一个n*n的矩阵,(i, j)表示第 i 种材料 和 第 j 种材料的影响值,这个矩阵代表这n个物品之间的影响值.当把这n个物品分成两部分后,每部分内部材料不会相互影响,但是不同部分的材料之间会相互影响.问如何分割使得两部分材料相互之间的最小影响值最大? 解题思路: 材料内部不会影响,那么只需要把影响值小的物品放在同一部分即可,所以用结构体保存物品之间的影响值,然后sort一下,影响值小的物品用并查集放在一个集合,当

福州大学第十三届程序设计竞赛_重现

Problem A Calculus Midterm 题意:略 题解:~~ Problem B 翻翻棋 题意:略 题解:~~ Problem C 平行四边形数 题意:略 题解:~~ Problem D 炉石传说 题意:略 题解:最直接的一个做法就是二分图,跑一遍判断是否匹配的数量为n.还可以的一个做法是贪心:先把对手的血量从大到小排,然后对于自己,选一个能满足对方攻击的自身攻击力最小的一个随从,然后不断重复,最后判断有无可选即可. 1 /*zhen hao*/ 2 #include <cstdi

福州大学第十三届程序设计竞赛_重现总结

 Problem C 平行四边形数 Accept: 82    Submit: 425 Time Limit: 2000 mSec    Memory Limit : 32768 KB  Problem Description 在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形.  Input 多组数据(<=10),处理到EOF. 每组数据第一行一个整数n(4<=n<=500).接下来n行每行两个整数xi,yi(0<

(并查集)~APTX4869(fzu 2233)

http://acm.fzu.edu.cn/problem.php?pid=2233 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)} 博士需要你帮忙求出

NYOJ 707 A Simple Problem(结构体排序) 睡前一水~~

链接:click here 题意: A Simple Problem 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 You know, just as the title imply, this is a simple problem. In a contest, given the team-id, solved, penalty of all the teams, tell me the champion.If the numbers of solved pr

A Math Problem

A Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 237    Accepted Submission(s): 117 Problem Description You are given a positive integer n, please count how many positive integers

Water Problem

water problem 发布时间: 2015年10月10日 15:34   时间限制: 1000ms   内存限制: 256M 描述 题意很简单 给你N个数, Q个查询 每次查询给你一个区间[L, R] 你要找出 [L, R] 这个区间里面取模M后的最大值. 输入 第一行一个T,表示测试数据组数.第二行两个整数N, M (1<=N<=10^5, 1<=M<=10^9).第三行给你N个整数 整数范围在1到10^9之间.第四行给你一个整数Q. ( 1<=Q<=10^5)

FOJ Problem 2261 浪里个浪

                                                                                                                                                           Problem 2261 浪里个浪 Accept: 40    Submit: 106Time Limit: 1500 mSec    Memory Limit : 32768 KB Pro

XJTUOJ wmq的A&#215;B Problem FFT

wmq的A×B Problem 发布时间: 2017年4月9日 17:06   最后更新: 2017年4月9日 17:07   时间限制: 3000ms   内存限制: 512M 描述 这是一个非常简单的问题. wmq如今开始学习乘法了!他为了训练自己的乘法计算能力,写出了n个整数,并且对每两个数a,b都求出了它们的乘积a×b.现在他想知道,在求出的n(n−1)2个乘积中,除以给定的质数m余数为k(0≤k<m)的有多少个. 输入 第一行为测试数据的组数. 对于每组测试数据,第一行为2个正整数n,