这是通化邀请赛的题,当时比赛的时候还完全没想法呢,看来这几个月的训练还是有效果的。。。

题意要求(1) |ai| < T for all i   (2) (vi, vj) in E <=> |ai - aj| >= T。由于(1)条件的存在,所以(2)条件能成立当且仅当ai和aj一正一负。由此可见,图中某条路上的元素正负值分别为正->负->正->负。。。显然当图中存在奇环的时候是无解的。判断奇环用二分染色,color[i]=0表示假设i节点未被染色,1表示假设i节点权值为正,2为负。

如果图中没有奇环呢?对于图中的一条边<u, v>,如果color[u]=1,那么显然a[u]-a[v] >= T,color[u]=2, 也就是 -(a[u]-a[v]) >= T;

而如果<u, v>不是图中的边, 必然有 | a[u]-a[v] |  < T。由color数组也同样能得到两个不等式。

得到不等式组后无脑跑spfa判负环就行了。。。光是判负环的spfa是不用考虑加入0节点的,在初始化得时候将每个节点加到队列一次就够了。而且d数组也完全可以初始化为0。因为你只需要判负环而已。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<fstream>
#include<sstream>
#include<vector>
#include<string>
#include<cstdio>
#include<bitset>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#define FF(i, a, b) for(int i=a; i<b; i++)
#define FD(i, a, b) for(int i=a; i>=b; i--)
#define REP(i, n) for(int i=0; i<n; i++)
#define CLR(a, b) memset(a, b, sizeof(a))
#define PB push_back
#define LL long long
#define eps 1e-10
#define debug puts("**debug**")
using namespace std;const int maxn = 333;
const int T = 1000;
struct Edge
{int from, to, dist;
};
vector<Edge> edges;
vector<int> G[maxn];
vector<int> g[maxn];
int n, ncase, color[maxn], flag, d[maxn], cnt[maxn];
bool inq[maxn];
char ch[maxn][maxn];void init()
{REP(i, n) G[i].clear(), g[i].clear();edges.clear(); CLR(color, 0);
}void add(int a, int b, int c)
{edges.PB((Edge){a, b, c});int nc = edges.size();G[a].PB(nc-1);
}void dfs(int u, int c) //二分染色
{color[u] = c;int nc = g[u].size();REP(i, nc){int v = g[u][i];if(!color[v]) dfs(v, 3-c);}
}bool spfa()
{queue<int> q;REP(i, n) d[i] = cnt[i] = 0, inq[i] = 1, q.push(i);while(!q.empty()){int u = q.front(); q.pop();inq[u] = false;REP(i, G[u].size()){Edge& e = edges[G[u][i]];if(d[e.to] > d[u] + e.dist){d[e.to] = d[u] + e.dist;if(!inq[e.to]){q.push(e.to);inq[e.to] = true;if(++cnt[e.to] > n) return true;}}}}return false;
}bool solve()
{//判奇圈REP(i, n) if(!color[i]) dfs(i, 1);REP(i, n) REP(j, g[i].size()) if(color[i] == color[g[i][j]]) return 0;REP(i, n){FF(j, i+1, n){if(ch[i][j] == '1'){if(color[i] == 1) add(i, j, -T);else add(j, i, -T);}else{if(color[i] == 1) add(j, i, T-1);else add(i, j, T-1);}}}if(spfa()) return 0;return 1;
}int main()
{scanf("%d", &ncase);while(ncase--){init();scanf("%d", &n);REP(i, n){scanf("%s", ch[i]);REP(j, n) if(i != j && ch[i][j] == '1') g[i].PB(j);}if(solve()) puts("Yes");else puts("No");}return 0;
}

hdu 4598 Difference(奇圈判定+差分约束)相关推荐

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

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

  2. 【HDU - 3440】House Man(差分约束)

    题干: In Fuzhou, there is a crazy super man. He can't fly, but he could jump from housetop to housetop ...

  3. HDU 4598 Difference

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

  4. HDU - 4598 Difference

    题意: 有一个图,给图上每个顶点都赋一个实数Ai.如果存在一个正整数T满足下面两个条件,这个图就是一个"difference". |Ai| <= T. (vi, vj) in ...

  5. hdu 4598 差分约束

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

  6. HDU4598 Difference(差分约束)

    题意: 有一个图,给图上每个顶点都赋一个实数Ai.如果存在一个正整数T满足下面两个条件,这个图就是一个"difference". 1. |Ai| <= T. 2. 如果点i, ...

  7. 差分约束 1:pku 1201 Intervals 2:pku 1364 King 3:hdu 1534

    一个很好的差分约束总结:http://972169909-qq-com.iteye.com/blog/1185527 第一:  感觉难点在于建图  第二:  ①:对于差分不等式,a - b <= ...

  8. 2017 CCPC final HDU - 6252 Subway Chasing (差分约束)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6252 题目大意:有n个车站,两个人轮流从第一个车站出发,第一个人先出发x分钟,第二个人再出发.接下来给 ...

  9. hdu 1534(差分约束)

    题意: 安排计划,有4种约束方式,给出你这些时间的n个约束.. 如果计划是可行的,求出每一件事发生的最早时间..否则输出"impossible".. ①. FAF a b a要在b ...

最新文章

  1. 阿里云(一)云存储OSS的命令行osscmd的安装和使用
  2. 【代码托管】如何使用Git工具托管本地代码到GitHub(也许是最简单易懂的图文教程)【含 Git+第三方工具TortoiseGit+中文语言包 百度云盘资源】
  3. Nginx教程-日志配置
  4. batch helper mv_batch_body fill logic technical_request-filter_string
  5. 深度 ghost linux系统,用Ghost实现Linux系统的备份
  6. html中字体 楷体_HTML,CSS,font-family:中文字体的英文名称
  7. Visual Studio Ultimate 2012 激活密钥
  8. 航模的无刷电机到底是什么电机
  9. Python中shape的用法
  10. Redis中set、setnx、setex区别
  11. [转贴]迅雷十年反思
  12. 微信小程序+阿里物联平台+合宙Air724UG搭建无服务器物联系统(三)---微信小程序直连阿里物联平台AliIoT
  13. 25张漂亮的微距摄影作品欣赏
  14. ICCV 2019无人驾驶研究成果大总结(含大量论文及项目数据)
  15. Unity 模拟键盘按键
  16. 人工智能基础---上机2:产生式系统
  17. 健身房管理系统模块功能流程图一
  18. C#Sockets编程实现群聊
  19. Deflater 和 Inflater 的用法
  20. 瓦尔机器人智能行李箱_智能行李箱有多智能_智能行李箱解放你的双手-太平洋IT百科...

热门文章

  1. Python3.6实现图片转文字
  2. SPA项目搭建及嵌套路由
  3. ​CAD图纸怎么转换成PDF格式?这两种方法快速转换
  4. 激光SLAM 前端数据预处理--剔除坏点方法总结
  5. python123第八周_GitHub - ChangYZ123/Python-100-Days: Python - 100天从新手到大师
  6. jav学习日记:多线程(一)
  7. perl应用:SNP的提取(2):从对比序列中找到SNP位点并输出 a.pl
  8. 源码解析-偏向锁撤销流程解读
  9. css实现鼠标悬停效果
  10. OpenCVSharp 分水岭算法