题意:

有一个图,给图上每个顶点都赋一个实数Ai。如果存在一个正整数T满足下面两个条件,这个图就是一个"difference"。

  1. |Ai| <= T。

  2. (vi, vj) in E <=> |ai - aj| >= T。

  3. 如果点i,j构成的边在图中存在,则 |Ai - Aj| >= T;否则 |Ai - Aj| < T。("<=>" 代表充要条件)

给出图,问这个图是否是一个"difference"。

思路:

  • 有题意可知,任意两个相邻的点,那么他们的值肯定是一正一负,所以随便任意选一个点,假设他是正的,然后染色,如果不能染成功,那就是no,

  • 如果可以染成功,在看看条件2, 那是一个充要条件,所以如果a b两个点不相邻,要满足 |a - b| < T.

  • 对于 i j, 如果 i j 相邻, 且 i 是正数,满足 ai−aj>=Ta_{i} - a_{j} >= T ai​−aj​>=T 也就是 aj−ai<=−Ta_{j} - a_{i} <= -T aj​−ai​<=−T

  • 对于 i j, 如果 i j 不相邻, 且 i 是正数, 满足 ai−aj<=T−1a_{i} - a_{j} <= T-1 ai​−aj​<=T−1

  • 有可能图不是全联通的,所以要建一个超级原点 0,

  • 如果 i 是正数,满足 0<=ai−a0<=T−10 <= a_{i} - a_{0} <= T - 1 0<=ai​−a0​<=T−1

  • 如果 i 是负数,满足 0<=a0−ai<=T−10 <= a_{0} - a_{i} <= T - 1 0<=a0​−ai​<=T−1

知道了所有的式子,对于式子形如 a−b<=Ta - b <= Ta−b<=T 建立一条从 b 到 a 权值为 T 的边

最好跑一遍spfa, 判断是不是又负环,如果有那么就输出来 No, 否则就是 Yes。

#include<bits/stdc++.h>
using namespace std;
const int N = 500;
const int INF = 500;
typedef pair<int,int>P;
vector<P>f[N];int n,m;
int s[N][N],dis[N],dep[N];
bool vv[N];bool bfs(int u){queue<int>q;while(!q.empty()) q.pop();q.push(u);dis[u] = 1;while(!q.empty()){u = q.front(); q.pop();for (int i = 1; i <= n; ++i){if (s[u][i] == 1){if (dis[i] == 0) {dis[i] = dis[u] ^ 3;q.push(i);}if (dis[u] == dis[i]) return 1;}}}return 0;
}bool spfa(int u){queue<int>q;q.push(u);dis[u] = 0;vv[u] = 1;while(!q.empty()){u = q.front(); q.pop();vv[u] = 0;for (auto it: f[u]){int v = it.first, w = it.second;if (dis[v] > dis[u] + w){dis[v] = dis[u] + w;if (!vv[v]){q.push(v);dep[v]++;vv[v] = 1;if (dep[v] > 300) return 1;}}}}return 0;
}int main(){int T;scanf("%d",&T);while(T--){scanf("%d",&n);memset(dis, 0, sizeof dis);memset(dep, 0, sizeof dep);for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)scanf("%1d",&s[i][j]);bool vis = 0;for (int i = 1; i <= n; ++i){if (!dis[i]) vis = vis || bfs(i);if (vis) break;}if (vis){puts("No");continue;} for (int i = 1; i <= n; ++i)for (int j = i + 1; j <= n; ++j){if (s[i][j] == 1){if (dis[i] == 1){f[i].push_back(P{j, -INF});} else {f[j].push_back(P{i, -INF});}} else {if (dis[i] == 1){f[j].push_back(P{i,INF-1});} else {f[i].push_back(P{j,INF-1});}}}for (int i = 1; i<= n; ++i){if (dis[i] == 1){f[0].push_back(P{i, INF-1});f[i].push_back(P{0,0});} else {f[i].push_back(P{0, INF-1});f[0].push_back(P{i, 0});}}vis = 0;for (int i = 0; i <= n; ++i){dis[i] = INF*1000;vv[i] = 0;}if (spfa(0)) puts("No"); else puts("Yes");for (int i = 0; i <= n;++i)f[i].clear();}return 0;
}
/*
3
4
0011
0001
1000
1100
4
0101
1010
0101
10104
0111
1001
1001
1110
3
000
000
000
*/

HDU - 4598 Difference相关推荐

  1. HDU 4598 Difference 差分约束 + 判奇圈

    题意:给你一个无向图 这个图是difference的如果存在一个正实数T使得图中所有的点的绝对值|ai|<T 并且点i j构成一条边当且仅当|ai-aj|>=T 问你是否存在一个这样的图 ...

  2. HDU 4598 Difference

    由|ai| < T for all i and ,(vi, vj) in E <=> |ai - aj| >= T,可知,相邻的边都是一正一负,dfs判断是否成立 差分约束判断 ...

  3. hdu 4598 Difference(奇圈判定+差分约束)

    这是通化邀请赛的题,当时比赛的时候还完全没想法呢,看来这几个月的训练还是有效果的... 题意要求(1) |ai| < T for all i   (2) (vi, vj) in E <=& ...

  4. 【HDU 5936 --- Difference】折半枚举+二分

    [HDU 5936 --- Difference]折半枚举+二分 Description Little Ruins is playing a number game, first he chooses ...

  5. HDU 5486 Difference of Clustering 图论

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5486 题意: 给你每个元素一开始所属的集合和最后所属的集合,问有多少次集合的分离操作,并操作和不变操 ...

  6. HDU 5936 Difference

    题意: 有一个函数f(y, k) = y的每个十进制位上的数字的k次幂之和 给x, k 求 有多少个y满足 x = f(y, k) - y 思路: (据说这叫中途相遇法?) 由于 x >= 0 ...

  7. hdu 4715 Difference Between Primes 2013年ICPC热身赛A题 素数水题

    题意:给出一个偶数(不论正负),求出两个素数a,b,能够满足 a-b=x,素数在1e6以内. 只要用筛选法打出素数表,枚举查询下就行了. 我用set储存素数,然后遍历set里面的元素,查询+x后是否还 ...

  8. hdu 4598 差分约束

    思路:首先就是判断是否有奇环,若存在奇环,则输出No. 然后用差分约束找是否符合条件. 对于e(i,j)属于E,并且假设顶点v[i]为正数,那么v[i]-v[j]>=T--->v[j]-v ...

  9. 苹果阻止升级插件ios12_苹果推出iOS 14,具有小部件和多项应用程序升级

    苹果阻止升级插件ios12 It's safe to say that iOS 13 has been troublesome at best. The latest iPhone software ...

最新文章

  1. 【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法)
  2. lvm的备份还原及修改UUID
  3. python中顺序查找法例子_Python查找算法(一)------ 顺序查找
  4. asp.net中获取当前url的方法
  5. 输入代码自动生成流程图_厉害了,这个工具能用伪代码生成流程图
  6. 计算机应用英语考什么,网考计算机应用基础(本)试卷10(国外英语资料).doc
  7. linux重定向多个文件,Linux base shell重定向详解
  8. mongo 唯一约束索引_快速掌握mongoDB(三)——mongoDB的索引详解
  9. python的pass在函数中的作用_Pass Share:Python / Julia 中函数变量的传递机制
  10. swat模型_SWAT-CUP(SUFI-2)的工作流程
  11. Python深入理解元组与列表的使用和区别
  12. Visual Studio 2010修改授权
  13. Swift 实践之UIWebView
  14. 交互式甘特图控件VARCHART XGantt教程:如何打印和导出图表(.NET版)
  15. luci网页shell_Luci框架-LUA的一个web框架使用
  16. 新机器部署linux系统(非虚拟机)
  17. 惊喜盲盒中奖iPhone 13已收到货
  18. 关于Value ‘0000-00-00 00:00:00‘ can not be represented as java.sql.Timestamp错误
  19. VMware vSphere(三)update management
  20. 主从服务器 php分配,MYSQL 主从服务器配置

热门文章

  1. 电脑读卡器,笔记本读卡器怎么用教程
  2. 什么是深度学习,深度学习和机器学习有什么关系?
  3. Excel模板导出并插入图片
  4. 我的世界java版mac切视角_我的世界伤害视角倾斜
  5. python爬虫与java爬虫的区别_java爬虫(一)主流爬虫框架的基本介绍
  6. 浅谈数字媒体艺术中的技术应用-3-工具介绍(二)
  7. B-样条曲线:重要性质
  8. Workfine5.0扩展功能——如何识别身份证信息?
  9. python绘制contourf填色图,设置色标,解决填图的颜色与实际数值不一致的问题
  10. Javascript变量名混淆细节