codechef Far Graphs

https://www.codechef.com/problems/TBGRAPH

题意 :

  • 给一个简单无向图,要求构造一个序列\(a\),长度为\(n\),极差小于等于\(L\)(任意),使得原图中\(x,y\)相连, 当且仅当\(|a_x-a_y|\ge L/2\)。 要求\(L\le 2e9,ai\)互不相等。

分析:

  • 显然\(L\)越大越好
  • 如果有奇环,一定是由一个三元环构成的,现在考虑没有奇环的情况。
  • 图是一个二分图,不妨把左侧点集放在左边,右侧点集放在右边。
  • 分别按度数排序,这样就能确定出\(a_i\)的相对位置关系。
  • 然后差分约束一下就可以了,复杂度\(O(n^2)\)。
  • 有奇环的情况,先任意求出一个三元环,枚举哪个点是\(L/2\),将他删掉,判断新图是否为二分图, 然后按二分图那么做,这里可以直接把和\(L\)相连的放在左边,把和\(0\)相连的放在右边。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <bitset>
#include <set>
#include <iostream>
using namespace std;
#define N 1050
#define M 1000050
#define db(x) cerr<<#x<<" = "<<x<<endl
const int inf=1000000000;
int mp[N][N],n,m,vis[N],col[N];
int lp3,a[N],b[N],la,lb,du[N],S;
int head[N],to[M],nxt[M],val[M],inq[N],cnt;
int dis[N],Q[N],dep[N],p1,p2,p3,d[N],FK;
bitset<N>bit[N];
inline void add(int u,int v,int w) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w;
}
inline bool cmp(int x,int y) {return du[x]<du[y];}
void dfs(int x,int y) {
// printf("x=%d y=%d\n",x,y);
vis[x]=1;
int i;
for(i=1;i<=n;i++) if(mp[x][i]) {
// if(x==6&&i==7) db(col[6]),db(col[7]),db(vis[7]);
if(!vis[i]) d[i]=d[x]+1,col[i]=col[x]^1,dfs(i,x);
}
}
void gun() {
puts("No");
}
bool spfa() {
int i,l=0,r=0;
for(i=1;i<=S;i++) dis[i]=1<<30,inq[i]=0,dep[i]=0;
dis[S]=0;
Q[r++]=S;
while(l!=r) {
int x=Q[l++]; inq[x]=0; if(l==S+1) l=0;
for(i=head[x];i;i=nxt[i]) if(dis[to[i]]>dis[x]+val[i]) {
dep[to[i]]=dep[x]+1;
if(dep[to[i]]>n+1) return 1;
dis[to[i]]=dis[x]+val[i];
if(!inq[to[i]]) {
inq[to[i]]=1;
Q[r++]=to[i];
if(r==S+1) r=0;
}
}
}
return 0;
}
void dfs2(int x) {
int i; vis[x]=1;
for(i=1;i<=n;i++) if(mp[x][i]&&i!=p2) {
if(!vis[i]) col[i]=col[x]^1,dfs2(i);
else if(col[i]==col[x]) {
FK=1;
}
}
}
void solve() {
lp3=0; FK=0;
la=lb=0; p1=p2=p3=0;
scanf("%d%d",&n,&m);
int i,x,y,j,k; S=n+1;
for(i=1;i<=n;i++) du[i]=0,vis[i]=d[i]=0,vis[i]=col[i]=0;
for(i=1;i<=S;i++) head[i]=0; cnt=0;
for(i=1;i<=n;i++) bit[i].reset();
for(i=1;i<=n;i++) for(j=1;j<=n;j++) mp[i][j]=0;
for(i=1;i<=m;i++) {
scanf("%d%d",&x,&y);
mp[x][y]=mp[y][x]=1,du[x]++,du[y]++;
bit[x][y]=bit[y][x]=1;
}
for(i=1;i<=n;i++) if(!vis[i]) d[i]=0,col[i]=0,dfs(i,0); for(i=1;i<=n&&!p1;i++) for(j=1;j<=n&&!p1;j++) if(i!=j&&mp[i][j]) {
if((bit[i]&bit[j]).count()) {
p1=i,p2=j; lp3=1;
for(k=1;k<=n;k++) if(mp[i][k]&&mp[j][k]) {p3=k; break;}
break;
}
} if(lp3) {
// printf("%d %d %d\n",p1,p2,p3);
int cas=3,loop=1;
for(;cas--;swap(p1,p2),swap(p2,p3)) {
int i,flg=1;
la=lb=0;
for(i=1;i<=n;i++) vis[i]=0,col[i]=0,d[i]=0;
FK=0;
for(i=1;i<=n;i++) if(!vis[i]&&i!=p2) col[i]=d[i]=0,dfs2(i);
if(FK) continue;
for(i=1;i<=n;i++) if(i!=p1&&i!=p2&&i!=p3) {
if(mp[i][p2]) {
flg=0; break;
}
if(mp[i][p1]&&mp[i][p3]) {flg=0; break;}
if(!mp[i][p1]&&!mp[i][p3]) {flg=0; break;}
if(mp[i][p1]) {
b[++lb]=i;
}else {
a[++la]=i;
}
}
if(!flg) {continue;}
for(i=1;i<=n;i++) du[i]=0;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(mp[i][j]&&j!=p1&&j!=p2&&j!=p3) {
du[i]++;
}
sort(a+1,a+la+1,cmp); sort(b+1,b+lb+1,cmp); for(i=1;i<=S;i++) head[i]=0; cnt=0; for(i=1;i<=la;i++) {
for(j=lb-du[a[i]]+1;j<=lb;j++) if(!mp[a[i]][b[j]]) {
break;
}
if(j<=du[a[i]]) {gun();return ;}
}
for(i=1;i<=lb;i++) {
for(j=la-du[b[i]]+1;j<=la;j++) if(!mp[b[i]][a[j]]) {
break;
}
if(j<=du[b[i]]) {gun();return ;}
}
add(S,p1,0); add(p1,S,0); add(S,p2,inf/2); add(p2,S,-inf/2); add(S,p3,inf); add(p3,S,-inf);
for(i=1;i<la;i++) add(a[i],a[i+1],-1);
if(la&&lb) add(b[1],a[1],-1);
for(i=lb;i>1;i--) add(b[i],b[i-1],-1);
for(i=1;i<=la;i++) add(S,a[i],inf/2-1);
for(i=1;i<=lb;i++) add(b[i],S,-inf/2-1),add(S,b[i],inf-1);
// for(i=1;i<=la;i++) db(a[i]);
// for(i=1;i<=lb;i++) db(b[i]); for(i=1;i<=la;i++) {
if(lb-du[a[i]]>=1) add(a[i],b[lb-du[a[i]]],inf/2-1);
else if(la) add(a[i],a[1],inf/2-1);
if(lb-du[a[i]]+1>=1&&lb-du[a[i]]+1<=lb) add(b[lb-du[a[i]]+1],a[i],-inf/2);
}
for(i=1;i<=lb;i++) {
if(la-du[b[i]]>=1) add(a[la-du[b[i]]],b[i],inf/2-1);
else if(lb) add(b[1],b[i],inf/2-1);
if(la-du[b[i]]+1>=1&&la-du[b[i]]+1<=la) add(b[i],a[la-du[b[i]]+1],-inf/2);
}
loop=spfa();
if(loop) continue;
puts("Yes");
printf("%d ",inf);
for(i=1;i<=n;i++) printf("%d ",dis[i]);
puts("");
// return ;
break;
}
if(loop) {gun(); return ;}
}else { for(i=1;i<=n;i++) {
if(!col[i]) a[++la]=i;
else b[++lb]=i;
}
sort(a+1,a+la+1,cmp);
sort(b+1,b+lb+1,cmp);
// db(la); db(lb);
// for(i=1;i<=la;i++) db(a[i]);
// for(i=1;i<=lb;i++) db(b[i]);
// for(i=1;i<=n;i++) db(du[i]);
for(i=1;i<=la;i++) {
for(j=lb-du[a[i]]+1;j<=lb;j++) if(!mp[a[i]][b[j]]) {
break;
}
if(j<=lb) {gun();return ;}
}
for(i=1;i<=lb;i++) {
for(j=la-du[b[i]]+1;j<=la;j++) if(!mp[b[i]][a[j]]) {
break;
}
if(j<=la) {gun();return ;}
} for(i=1;i<=n;i++) add(S,i,inf);
for(i=1;i<la;i++) add(a[i],a[i+1],-1);
if(la&&lb) add(b[1],a[1],-1);
for(i=lb;i>1;i--) add(b[i],b[i-1],-1); for(i=1;i<=la;i++) {
if(lb-du[a[i]]>=1) add(a[i],b[lb-du[a[i]]],inf/2-1);
else if(la) add(a[i],a[1],inf/2-1);
if(lb-du[a[i]]+1>=1&&lb-du[a[i]]+1<=lb) add(b[lb-du[a[i]]+1],a[i],-inf/2);
}
for(i=1;i<=lb;i++) {
if(la-du[b[i]]>=1) add(a[la-du[b[i]]],b[i],inf/2-1);
else if(lb) add(b[1],b[i],inf/2-1);
if(la-du[b[i]]+1>=1&&la-du[b[i]]+1<=la) add(b[i],a[la-du[b[i]]+1],-inf/2);
} int loop=spfa();
if(loop) {gun(); return ;}
puts("Yes");
printf("%d ",inf);
for(i=1;i<=n;i++) printf("%d ",dis[i]);
puts(""); } for(i=1;i<=n;i++)
for(j=1;j<=n;j++) if((abs(dis[i]-dis[j])>=inf/2)^mp[i][j]) puts("FUCK");
}
#include <cmath>
typedef double f2;
int main() {
// f2 a=log(1000000001);
// int i;
// for(i=1;i<=1000000000;i++) a-=1.0/i;
// printf("%.5f\n",a); // freopen("graph.in","r",stdin);
// freopen("graph.out","w",stdout); int T;
scanf("%d",&T);
while(T--)solve();
}
/*
3
3 3
1 2
2 3
3 1
7 8
1 6
1 4
3 2
6 3
3 4
4 5
4 7
5 6
4 6
1 2
1 3
1 4
2 3
2 4
3 4
*/

codechef Far Graphs的更多相关文章

  1. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1288  Solved: 490 ...

  2. tunning-Instruments and Flame Graphs

    On mac os, programs may need Instruments to tuning, and when you face too many probe messages, you'l ...

  3. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  4. Intel® Threading Building Blocks (Intel® TBB) Developer Guide 中文 Parallelizing Data Flow and Dependence Graphs并行化data flow和依赖图

    https://www.threadingbuildingblocks.org/docs/help/index.htm Parallelizing Data Flow and Dependency G ...

  5. 特征向量-Eigenvalues_and_eigenvectors#Graphs

    https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors#Graphs A               {\displaystyle A} ...

  6. UVALive 6508 Permutation Graphs

    Permutation Graphs Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit ...

  7. codechef 两题

    前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...

  8. codechef January Challenge 2014 Sereja and Graph

    题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...

  9. BZOJ3509: [CodeChef] COUNTARI

    3509: [CodeChef] COUNTARI Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 85[Submit][St ...

随机推荐

  1. Nordic官方网络资源介绍(官网/devzone/GitHub)

    本文将介绍Nordic官方网络资源,包括Nordic官网,开发者论坛(devzone),以及Nordic在GitHub上的共享资源. 1. Nordic官网(产品/SDK/工具/文档库) Nordic ...

  2. python下调用不在环境变量中的firefox

    from selenium.webdriver.firefox.firefox_binary import FirefoxBinary binary = FirefoxBinary(r"D: ...

  3. mui 禁止透明背景点击关闭弹窗遮罩

    //禁止关闭遮罩 window.addEventListener('tap', function(e) { e.target.className == 'mui-backdrop mui-active ...

  4. hduacm集训单人排位赛1002

    自适应simpson积分公式 通过二分区间递归求simpson积分 #include<map> #include<set> #include<cmath> #inc ...

  5. 【转】Ubuntu 14.04 引导修复(Boot Repair)(双系统修复一)

    这几天不是我闲着没事做,实在是电脑故意跟我过不去,一不小心,Windows就再也无法打 开了,然后的然后,你们都知道就是重装系统喽.但是重装系统后,会发现原来的Ubuntu引导不见了,开机直接进入Wi ...

  6. Linux命令 ls -l 输出内容含义详解

    Linux命令 ls -l s输出内容含义详解   1. ls  只显示文件名或者文件目录 2. ls -l(这个参数是字母L的小写,不是数字1) 用来查看详细的文件资料 在某个目录下键入ls -l可 ...

  7. Ansible 小手册系列 九(Playbook)

    playbook是由一个或多个"play"组成的列表.play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.从根本上来讲所谓task无非 ...

  8. 转载:left join和left semi join的联系和区别

    1.联系 他们都是 hive join 方式的一种,join on 属于 common join(shuffle join/reduce join),而 left semi join 则属于 map ...

  9. 三、dbms_pipe(类似UNIX系统的管道)

    1.概述 说明:Oracle管道类似UNIX系统的管道,但不采用OS机制实现,管道信息被缓存到SGA中,当关闭例程时会丢失管道信息,建立公用管道所有数据库用户都可访问,私有管道只能由建立这访问.作用: ...

  10. Prism 4 文档 ---第7章 组成用户界面

    一个应用程序的用户界面(UI)可以通用以下几种模式之一来构建: 窗体所需要所有的控件都包含在一个单独的XAML文件中,在设计时组合这个窗体. 窗体的逻辑区域被分割到单独的部分中,通常指哟过户控件.这些 ...