传送门

题意:

思路: 一开始被题意迷惑了,没看出来差分约束,老菜鸡啦。首先看到aj=ai+1a_j=a_i+1aj​=ai​+1可以把aia_iai​分成奇偶,让后这个图就变成一个二分图了。再考虑如何连边:
(1) 对于b=1b=1b=1的情况,aj=ai+1a_j=a_i+1aj​=ai​+1,转化成不等式就是ai<=aj−1a_i<=a_j-1ai​<=aj​−1和aj<=ai+1a_j<=a_i+1aj​<=ai​+1,所以建图方式为(j,i,−1)(j,i,-1)(j,i,−1)和(i,j,1)(i,j,1)(i,j,1)。
(2) 对于b=0b=0b=0的情况,∣ai−aj∣=1|a_i-a_j|=1∣ai​−aj​∣=1,去掉不等式又可以分成两种情况:
①①① aj=ai+1a_j=a_i+1aj​=ai​+1 连边方式跟上面一样
②②② ai=aj+1a_i=a_j+1ai​=aj​+1,转化成不等式ai<=aj+1a_i<=a_j+1ai​<=aj​+1和aj<=ai−1a_j<=a_i-1aj​<=ai​−1,连边为(j,i,1)(j,i,1)(j,i,1)和(i,j,−1)(i,j,-1)(i,j,−1)。
可以发现第二种情况有四条边,即(i,j,1),(i,j,−1),(j,i,1),(j,i,−1)(i,j,1) ,(i,j,-1),(j,i,1),(j,i,-1)(i,j,1),(i,j,−1),(j,i,1),(j,i,−1)。但是对于(i,j,1)(i,j,1)(i,j,1)转化成不等式j−i<=1j-i<=1j−i<=1,把(i,j,−1)(i,j,-1)(i,j,−1)转成不等式j−i<=−1j-i<=-1j−i<=−1,当第一个成立的时候,第二个显然成立,所以只保留第一个就行啦。
让后跑差分约束就好啦,nnn比较小,直接floydfloydfloyd跑顺便判断一下负环就好啦。
这里用并查集判断的二分图。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=310,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int g[N][N],p[N*2];int find(int x) { return x==p[x]? x:p[x]=find(p[x]); }bool check()
{for(int i=1;i<=n;i++) if(find(i)==find(i+n)) return true;return false;
}bool floyd()
{for(int k=1;k<=n;k++)for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)g[i][j]=min(g[i][j],g[i][k]+g[k][j]);if(g[i][i]<0) return true;}return false;
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d%d",&n,&m);for(int i=1;i<=n*2;i++) p[i]=i;memset(g,0x3f,sizeof(g));for(int i=1;i<=n;i++) g[i][i]=0;for(int i=1;i<=m;i++){int a,b,op; scanf("%d%d%d",&a,&b,&op);g[a][b]=1; g[b][a]=-1;if(!op) g[b][a]=1;p[find(a)]=find(b+n);p[find(a+n)]=find(b);}if(check()||floyd()) { puts("NO"); return 0; }int ans=-1,id=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)if(g[i][j]>ans) ans=g[i][j],id=i;}puts("YES");printf("%d\n",ans);for(int i=1;i<=n;i++) printf("%d ",g[id][i]);return 0;
}
/**/

Codeforces Global Round 12 E. Capitalism 差分约束相关推荐

  1. Codeforces Global Round 12 C2. Errich-Tac-Toe (Hard Version)(思维)

    题目描述 The only difference between the easy and hard versions is that tokens of type O do not appear i ...

  2. Codeforces Global Round 12 D. Rating Compression 思维 + 贪心

    传送门 题意: 给一个长度为nnn的数组aaa,定义一个数组bbb,且bj=minj<=i<=j+k−1aib_j=min_{j<=i<=j+k-1}a_ibj​=minj&l ...

  3. Codeforces Global Round 12 C1 C2. Errich-Tac-Toe 思维构造 好题

    传送门 题意: 给了如下规则,上面三个只要出现一个情况就是非平局,现在给你个字符矩阵,让后其中XXX字符有KKK个(hardhardhard版本XXX和OOO一共KKK个),每次操作可以将XXX变成O ...

  4. Codeforces Global Round 1

    Codeforces Global Round 1 题解:The Editorial of the First Codeforces Global Round A:其实mod 2计算一下就行了 B:删 ...

  5. Codeforces Global Round 1 晕阙记

    Codeforces Global Round 1 晕阙记 我做这场比赛的时候晕得要死.做这三道题做太久了,rating涨不起来啊! A 如果愿意的话你可以看做是膜2意义下的运算,写快速幂等各种膜运算 ...

  6. Codeforces Global Round 3

    Codeforces Global Round 3 A. Another One Bites The Dust 有若干个a,有若干个b,有若干个ab.你现在要把这些串拼成一个串,使得任意两个相邻的位置 ...

  7. Codeforces Global Round 14 F. Phoenix and Earthquake 思维 + 并查集

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点,mmm条边,限制xxx,每个点都有沥青aia_iai​,定义合并两个点即两点之间有边且au+av≥xa_u+a_v\ge xau​+av​≥x ...

  8. 【Codeforces Global Round 23】B. Rebellion

    Codeforces Global Round 23中B. Rebellion Codeforces比赛记录 文章目录 题目链接: 一.B. Rebellion 题目意思: 上思路: 总结 B. Re ...

  9. Codeforces Global Round 4-D. Prime Graph(伯特兰-切比雪夫定理)

    题目:Codeforces Global Round 4-D. Prime Graph 题意:给出n(顶点的个数),要求所得图满足: 1.无平行边和自环 2.边的总数是个质数 3.每个点的度(也就是点 ...

最新文章

  1. 控制台打印汉字的方法
  2. 如何顺利度过新人适应期
  3. python 获取 程序运行时间
  4. arm-linux-g 找不到头文件,交叉编译错误“ arm-none-eabi-g ++找不到条目符号”
  5. ajax async
  6. java 广义表_java 输入广义表 生成二叉树 | 学步园
  7. 如何在virtualbox中对虚拟机截图
  8. 生物大分子的计算机模拟就业,生物大分子模拟
  9. 重绘(redraw或repaint),重排(reflow)
  10. apktool + dex2jar + xjad反编译apk文件
  11. LaTex笔记二:visio画图并保存为eps格式
  12. 数据库的备份与恢复技术
  13. 2.4g和5g要不要合并_路由器2.4g和5g要不要合并?
  14. pnp mysql_NPN和PNP三极管的区别
  15. Apche Kafka 的生与死 – failover 机制详解
  16. uniapp使用百度地图
  17. qcqa是什么职位_QA和QC是什么意思?区别是什么?
  18. NetBeans的学习资源
  19. 经合组织:ICO有融资优势 但还不是主流工具
  20. 使用python连接mysql数据库

热门文章

  1. android 网卡监听,Android实时监听网络的变化
  2. cake fork什么意思_Java7任务并行执行神器:Forkamp;Join框架
  3. 如何优雅的当海王……
  4. 那些你从未见过的神奇物理化学实验,今天全给你整理了!
  5. 快别发语音了! | 今日最佳
  6. 被学校辞退、拒绝FB后:语音识别大牛Povey确认兼职北京初创公司,称主业还选中国...
  7. sklearn集合算法预测泰坦尼克号幸存者
  8. e2200网卡驱动 linux,Linux驱动修炼之道-驱动中一些常见的宏
  9. linux7为nginx添加服务,CentOS7添加Nginx为系统服务
  10. redis 清空缓存_「镜头回放」简直了!spring中清除redis缓存导致应用挂死