[hdu4598]二分图判定,差分约束
题意: 给一个图,问能否给每个点分配一个实数值,使得存在一个数实数T,所有点满足:|value(i)| < T 且 u,v之间有边<=> |value(u)-value(v)| >= T。(注意等价符号)
思路:
由性质可得,两相邻点的分配的值的符号相反,于是先对原图做一个二分图判定,如果是非二分图,则无解。对二分图染色后,假设color[i]=1,则表示i点为正值,color[i]=-1,则表示为负。在已知每个点正负值的基础上,绝对值符号可以去掉,差分约束模型便出来了。这里有个细节,由于是实数,在遇到<和<=的时候比较麻烦,幸运的是我们可以用整数来代替实数,比如条件a < b可以看成是 a <= (b - 1),只要整数范围足够大即可。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <queue>#include <cmath>#include <algorithm>using namespace std;const int T = 12345;struct Graph { vector<vector<int> > G; void clear() { G.clear(); } void resize(int n) { G.resize(n + 2); } void add(int u, int v) { G[u].push_back(v); } vector<int> & operator [] (int u) { return G[u]; }};Graph G, E;int n;bool mark[345][345];int vis[345];void add(int u, int v, int w) { G.add(v, u); E.add(v, w);}queue<int> Q;int D[345], cnt[345];bool relax(int u, int v, int w) { if (D[u] > D[v] + w) { D[u] = D[v] + w; return true; } return false;}bool SPFA(int s) { while (!Q.empty()) Q.pop(); memset(D, 0x3f, sizeof(D)); memset(cnt, 0, sizeof(cnt)); D[s] = 0; memset(vis, 0, sizeof(vis)); vis[s] = 1; cnt[s] ++; Q.push(s); while (!Q.empty()) { int node = Q.front(); Q.pop(); vis[node] = 0; int sz = G[node].size(); for (int i = 0; i < sz; i ++) { int u = G[node][i]; if (relax(u, node, E[node][i])) { if (!vis[u]) { vis[u] = 1; cnt[u] ++; if (cnt[u] > n) return false; Q.push(u); } } } } return true;}bool Color(int k, int c) { vis[k] = c; for (int i = 0; i < n; i ++) { if (mark[k][i]) { if (vis[i]) { if (vis[i] == vis[k]) return false; } else if (!Color(i, -c)) return false; } } return true;}bool check() { memset(vis, 0, sizeof(vis)); for (int i = 0; i < n; i ++) { if (!vis[i]) { if (!Color(i, 1)) return false; } } G.clear(); E.clear(); G.resize(n); E.resize(n); // 添加一个源点编号为 n, 并从源点引出n条到每个点的有向边,边权为0 for (int i = 0; i < n; i ++) { add(i, n, 0); } for (int i = 0; i < n; i ++) { for (int j = i + 1; j < n; j ++) { if (mark[i][j]) { if (vis[i] > 0) add(j, i, -T); else add(i, j, -T); } else { if (vis[i] > 0) add(i, j, T - 1); else add(j, i, T - 1); } } } n ++; // 多了一个源点 return SPFA(n - 1);}int main() {#ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin);#endif // ONLINE_JUDGE int T; cin >> T; while (T --) { cin >> n; memset(mark, 0, sizeof(mark)); for (int i = 0; i < n; i ++) { char s[345]; scanf("%s", s); for (int j = 0; j < n; j ++) { mark[i][j] = s[j] == '1'; } } puts(check()? "Yes" : "No"); } return 0;} |
[hdu4598]二分图判定,差分约束的更多相关文章
- hdu 4598 Difference(奇圈判定+差分约束)
这是通化邀请赛的题,当时比赛的时候还完全没想法呢,看来这几个月的训练还是有效果的... 题意要求(1) |ai| < T for all i (2) (vi, vj) in E <=& ...
- poj 1201 Intervals(差分约束)
做的第一道差分约束的题目,思考了一天,终于把差分约束弄懂了O(∩_∩)O哈哈~ 题意(略坑):三元组{ai,bi,ci},表示区间[ai,bi]上至少要有ci个数字相同,其实就是说,在区间[0,500 ...
- 【BZOJ4500】矩阵(差分约束)
[BZOJ4500]矩阵(差分约束) 题面 BZOJ 然而权限题 题解 显然拆分行和列.不妨设这一行/列总共加减的值是\(p\),那么每一个限制就是两个数的和为一个特定的数.这样子不好做,反正是一个二 ...
- Halum UVA - 11478 差分约束
输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 复制 2 1 1 2 10 2 1 1 2 -10 3 3 1 2 4 2 3 2 3 1 5 4 5 2 3 4 4 2 5 3 ...
- HDU3666 THE MATRIX PROBLEM (差分约束+取对数去系数)(对退出情况存疑)
You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...
- 最短路 & 差分约束 总结
一.引例 1.一类不等式组的解 二.最短路 1.Dijkstra 2.图的存储 3.链式前向星 4.Dijkstra + 优先队列 ...
- [CCPC2019 哈尔滨] A. Artful Paintings - 差分约束,最短路
Description 给 \(N\) 个格子区间涂色,有两类限制条件 区间 \([L,R]\) 内至少 \(K\) 个 区间 \([L,R]\) 外至少 \(K\) 个 求最少要涂多少个格子 Sol ...
- Candies-POJ3159差分约束
Time Limit: 1500MS Memory Limit: 131072K Description During the kindergarten days, flymouse was the ...
- CF687A. NP-Hard Problem[二分图判定]
A. NP-Hard Problem time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
随机推荐
- Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述
Spark SQL模块,主要就是处理跟SQL解析相关的一些内容,说得更通俗点就是怎么把一个SQL语句解析成Dataframe或者说RDD的任务.以Spark 2.4.3为例,Spark SQL这个大模 ...
- Java前台传值至后台中文乱码
记一次常见问题 今天导入了一个网上下载的项目,运行后发现,前台传值 到Servlet,Servlet保存至数据库,数据库保存的中文数据出现乱码,检查了一下表中的编码是utf8没错. 输出测试了一下 原 ...
- VMware15 安装Mac 10.14系统/苹果系统
安装环境 Windows专业版 VMware Workstation Pro 15 所需资源 VMware Workstation Pro 15.0.0 Build 10134415 官网下载地址:h ...
- vscode 使用记录
快捷键 Cmd+P 查找最近的文件 Ctrl+cmd + P 打开命令面板 Ctrl+tab文件间切换 Ctrl+` 打开终端 Cmd +b 隐藏侧边栏 VScode对多行编辑有两种模式 第一种模式 ...
- 【一起学设计模式】观察者模式实战:真实项目中屡试不爽的瓜娃EventBus到底如何实现观察者模式的?
申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 之前出过一个设计模式的系列文章,这些文章和其他讲设计模式的文 ...
- s2h-HTTP Status 404 - No result defined for action and result input错误解决
今天做个小项目,用的是ssh,结果在运行的时候出现HTTP Status 404 - No result defined for action and result input的错误. 首先认真检查所 ...
- 进程、线程和携程的通俗解释【刘新宇Python】
通过下面这张图你就能看清楚了,进程.线程和携程的关系 进程: 多个进程是可以运行在多个CPU当中的,比如你的电脑是4核,可以同时并行运行四个进程,这是真正物理上的并行运行. 线程: 每个进程又可以 ...
- SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回
SpringBoot系列(十)统一异常处理与统一结果返回 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列 ...
- Java 网络编程 -- 基于TCP实现文件上传
Java TCP 操作基本流程 一.创建服务器 1.指定端口, 使用serverSocket创建服务器 2.阻塞式连接 accept 3.操作:输入流 输出流 4.释放资源 二.创建客户端 1.使用S ...
- Inno Setup打包之先卸载再安装
使用Inno Setup打包程序之后,如果想要在安装前先卸载,那么需要加下面代码,需要注意的是红色标注的改为你们自己的.网上看到有些说_is1前面用AppName,但是我这边验证不行. [Setup] ...