1、给定一个带权有向图。选出一些边满足使得任意两点可相互到达的前提下使得选出的边的权值的最大最小差值最小。

思路:二分答案,然后枚举权值的范围判断是否可行。

#include <stdio.h>
#include <string>
#include <stack>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std; vector<int> g1[55];
vector<int> g2[55]; class HardProof
{
int n;
int G[55][55];
int a[55*55],aNum; void dfs(int u,int f[],vector<int> g[55])
{
if(f[u]) return;
f[u]=1;
for(int i=0;i<(int)g[u].size();++i)
{
int v=g[u][i];
dfs(v,f,g);
}
} int check(int M)
{
for(int i=1;i<=aNum;++i)
{
const int S=a[i]; for(int i=0;i<n;++i) g1[i].clear(),g2[i].clear(); for(int i=0;i<n;++i) {
for(int j=0;j<n;++j) {
if(i!=j&&S<=G[i][j]&&G[i][j]<=S+M) {
g1[i].push_back(j);
g2[j].push_back(i);
}
}
}
int f1[55],f2[55];
memset(f1,0,sizeof(f1));
memset(f2,0,sizeof(f2)); dfs(0,f1,g1);
dfs(0,f2,g2); for(int i=0;i<n;++i) {
if(!f1[i]||!f2[i]) break;
if(i==n-1) return 1;
}
}
return 0;
} public:
int minimumCost(vector<int> D)
{
n=1;
while(n*n!=(int)D.size()) ++n;
if(1==n) return 0; int low=150000,high=0;
aNum=0;
for(int i=0;i<n;++i) {
for(int j=0;j<n;++j) if(i!=j) {
int p=D[i*n+j];
if(p<low) low=p;
if(p>high) high=p;
G[i][j]=p;
a[++aNum]=p;
}
} sort(a+1,a+aNum+1);
aNum=unique(a+1,a+aNum+1)-(a+1); high=high-low;
low=0;
int ans=high;
while(low<=high)
{
int M=(low+high)>>1;
if(check(M)) ans=min(ans,M),high=M-1;
else low=M+1;
}
return ans;
}
};

  

topcoder srm 692 div1 -23的更多相关文章

  1. topcoder srm 715 div1 -23

    1.一个计算器,它执行的是一个只包含‘+’,‘-’的字符串$s$.初始化值为0,每遇到一个‘+’增加1,否则减少1.并保存运算过程的最大最小值$Max,Min$,最后的答案是$Max-Min$.比如$ ...

  2. topcoder srm 710 div1 -23

    1.给定两个长度都为$n$的数组$A,B$,给出一个操作序列将$A$变成$B$.每个操作可以是以下两种之一:(1)选择一个$i,0\leq i <n$且$A_{i} \neq 0$,令$t=A_ ...

  3. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  4. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  5. topcoder srm 460 div1

    problem1 link 设$f[i][j]$表示已经分配了answers中的前$i$个,分配给的问题的状态为 $j$的方案数. 其中状态可以用$n$位的三进制表示,0表示还未分配,1表示已分配是 ...

  6. topcoder srm 696 div1 -3

    1.给定一个50个节点的无向图,有$m$条边.现在以任意一种序列对每个节点染色.染当前节点的代价为染色完当前节点后满足两个端点都被染色的边的数量.求最小的染色代价.$m \leq 20$ 思路:一个直 ...

  7. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  8. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  9. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

随机推荐

  1. mysql常用参数监控

      1.系统mysql的进程数 ps -ef | grep "mysql" | grep -v "grep" | wc –l 2.Slave_running m ...

  2. Mysql由浅入深

      1. Mysql的安装方式 1. yum安装mysql 适合对数据库要求不太高的场合,例如:并发不大,公司内部,企业内部. 1. 官网下载yum源,wget https://dev.mysql.c ...

  3. python爬取12306及各参数的使用。完整代码

    import requestsfrom retrying import retryreuquests和retrying的下载及安装可以通过命令行pip install 口令实现 # 调用重连装饰器固定 ...

  4. 图片和base64互转

    最近项目需要将图片以base64编码,这里记录下相关的一些东西. 需要导入两个类:sun.misc.BASE64Encoder sun.misc.BASE64Decoder 下面是相关java代码: ...

  5. [5]windows内核情景分析---进程线程

    本篇主要讲述进程的启动过程.线程的调度与切换.进程挂靠 进程的启动过程: BOOL CreateProcess ( LPCTSTR lpApplicationName,                 ...

  6. Message对象

    一)描述 1: 每一个Message对象都包含两个对象: (1)google::protobuf::Descriptor 描述对象,是Message所有Filed的一个集合,它又包含了FieldDes ...

  7. Vue系列之 => 通过vue-resource发起ajax请求

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 【转】SQL Server 运行状况监控SQL语句

    SQL Server 运行状况监控SQL语句   Microsoft SQL Server 2005 提供了一些工具来监控数据库.方法之一是动态管理视图.动态管理视图 (DMV) 和动态管理函数 (D ...

  9. ReactiveCocoa(I)

    ReactiveCocoa常见类 1. RAC中最核心的类RACSiganl: RACSiganl:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据 解析: 信号类 ...

  10. 解释器模式 Interpreter

    代码例子 参考 1.解释器模式定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 说明:解释器模式设计到文法规则和抽象语法树. 2.解释器模式的结构 ...