二分+2-sat

枚举第一个权值,二分第二个权值,然后2-sat检查,当第一个权值已经不能形成二分图时,再往下没意义,因为没法分成两个点集。(双指针好像跑得慢)

#include<bits/stdc++.h>
using namespace std;
const int N = ;
struct edge {
int u, v, w;
edge(int u = , int v = , int w = ) : u(u), v(v), w(w) {}
bool friend operator < (edge A, edge B)
{
return A.w > B.w;
}
} e[N * N];
int n, tot, cnt, all, top, ans;
int dfn[N], low[N], st[N], belong[N], vis[N], Map[N][N], color[N], fa[N], d[N];
vector<int> G[N], g[N];
int find(int x)
{
if(fa[x] == x) return x;
int ret = find(fa[x]);
d[x] ^= d[fa[x]];
return fa[x] = ret;
}
void tarjan(int u)
{
dfn[u] = low[u] = ++cnt;
st[++top] = u;
vis[u] = ;
for(int i = ; i < G[u].size(); ++i)
{
int v = G[u][i];
if(!dfn[v])
{
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(vis[v]) low[u] = min(low[u], low[v]);
}
if(low[u] == dfn[u])
{
++all;
int j;
while()
{
j = st[top];
belong[j] = all;
vis[j] = ;
--top;
if(j == u) break;
}
}
}
bool check(int x, int y)
{
memset(dfn, , sizeof(dfn));
memset(low, , sizeof(low));
memset(vis, , sizeof(vis));
top = ;
cnt = ;
all = ;
if(x > y) swap(x, y);
for(int i = ; i <= * n; ++i)
G[i].clear();
for(int i = ; i <= tot; ++i)
{
if(e[i].w > y)
{
G[e[i].u].push_back(e[i].v + n);
G[e[i].v].push_back(e[i].u + n);
G[e[i].u + n].push_back(e[i].v);
G[e[i].v + n].push_back(e[i].u);
}
else if(e[i].w > x)
{
G[e[i].u].push_back(e[i].v + n);
G[e[i].v].push_back(e[i].u + n);
}
}
for(int i = ; i <= * n; ++i) if(!dfn[i]) tarjan(i);
for(int i = ; i <= n; ++i) if(belong[i] == belong[i + n]) return false;
return true;
}
int main()
{
scanf("%d", &n);
for(int i = ; i <= n; ++i) fa[i] = i;
for(int i = ; i < n; ++i)
for(int j = ; j <= n - i; ++j)
{
scanf("%d", &Map[i][i + j]);
e[++tot] = edge(i, i + j, Map[i][i + j]);
}
if(n == )
{
puts("");
return ;
}
++tot;
sort(e + , e + tot + );
ans = ;
int j = tot;
for(int i = ; i <= tot && i <= j; ++i)
{
while(j && !check(e[i].w, e[j].w)) --j;
int u = find(e[i].u), v = find(e[i].v);
if(u != v)
{
ans = min(ans, e[i].w + e[j].w);
d[u] = d[e[i].u] ^ d[e[i].v] ^ ;
fa[u] = v;
}
else if(d[e[i].u] == d[e[i].v])
{
ans = min(ans, e[i].w + e[j].w);
break;
}
}
printf("%d\n", ans);
return ;
}

bzoj4078的更多相关文章

  1. BZOJ4078 WF2014Metal Processing Plant(二分答案+2-SAT)

    题面甚至没给范围,由数据可得n<=200.容易想到二分答案,暴力枚举某集合的价值,2-SATcheck一下即可.这样是O(n4logn)的. 2-SAT复杂度已经是下界,考虑如何优化枚举.稍微改 ...

  2. BZOJ4078 : [Wf2014]Metal Processing Plant

    设$D(A)\leq D(B)$,从小到大枚举$D(A)$,双指针从大到小枚举$D(B)$. 那么对于权值不超过$D(A)$的边,可以忽略. 对于权值介于$(D(A),D(B)]$之间的边,需要满足那 ...

随机推荐

  1. html5——私有前缀

    CSS3的浏览器私有属性前缀是一个浏览器生产商经常使用的一种方式.它暗示该CSS属性或规则尚未成为W3C标准的一部分,像border-radius等属性需要加私有前缀才奏效 1.-webkit-:谷歌 ...

  2. python调用java API

    JPype documentation JPype is an effort to allow python programs full access to java class libraries. ...

  3. 图论 Make Unique:有向图和无向图的一些算法

    计算机科学入门资料之一的<算法与数据结构-C语言版>,覆盖了基础算法的几乎所有分支,其中的一个典型分支为图理论. 一个简介:图论基础-图数据结构基础 一个简洁的博客:图论基础,简列一本书 ...

  4. 关于python中的property

    python中的property在类实例化的时候 可以把类方法变成类属性使用, 还可以用在简化赋值上 1)不用property的时候,你的类可能是这样写的 2)用propery的时候你可能会这样写,调 ...

  5. unable to get system library for the project

    当向eclipse导入项目实例后,项目上出现红叉的错误提示,在项目属性里的Java Build Path里发现了错误提示复选选项: unable to get system library for t ...

  6. tidyverse生态链

    一套完整的数据分析流程 , 如下图所示 从图中可以看到,整个流程包括读取数据,整洁数据,数据探索和交流部分.经过前两部分, 我们可以得到一个整理好的数据,它的每一行都是一个样本 , 每一列是一个变量. ...

  7. Python 之web动态服务器

    webServer.py代码如下: import socket import sys from multiprocessing import Process class WSGIServer(obje ...

  8. PHP 之sha256 sha512封装

    /* PHP sha256 sha512目前(PHP 7.1)没有内置的函数来计算,sha1() sha1_file() md5() md5_file()分别可以用来计算字符串和文件的sha1散列值和 ...

  9. CAD绘制一个线型标注(com接口VB语言)

    主要用到函数说明: _DMxDrawX::DrawDimRotated 绘制一个线型标注.详细说明如下: 参数 说明 DOUBLE dExtLine1PointX 输入第一条界线的起始点X值 DOUB ...

  10. PyCharm社区版+Django搭建web开发环境

    PyCharm开源社区版不像商业版那样可以直接通过Django来创建项目,必须通过以下几个步骤进行: 1. 创建项目:在cmd命令行下输入:django-admin startproject Demo ...