题意

根据图中公式由A[]构造B[][],现在给你B,问你存不存在一个数组A使之成立。

题解:对于每一位进行2-sat求解。

比赛半个小时时间,没做出来……

一直T。

因为本身对算法不确定,所以也不知道怎么办

赛后才发现是数组开小了、、、、

真坑啊。。。

#include <bits/stdc++.h>

using namespace std;

const int N = ;
int a[N], b[N][N]; struct Edge {
int from, to, next;
} edge[N*N*];
int head[N], cntE; void addedge(int u, int v) {
edge[cntE].from = u;
edge[cntE].to = v;
edge[cntE].next = head[u];
head[u] = cntE++;
} int dfn[N], low[N], idx;
int stk[N], top;
int in[N];
int kind[N], cnt; void tarjan(int u) {
dfn[u] = low[u] = ++idx;
in[u] = true;
stk[++top] = u;
for (int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].to;
if (!dfn[v]) tarjan(v), low[u] = min(low[u], low[v]);
else if (in[v]) low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
++cnt;
while () {
int v = stk[top--];
kind[v] = cnt;
in[v] = false;
if (v == u) break;
}
}
} int opp[N], ind[N], col[N];
bool topsort(int n) {
for (int i = ; i < *n; ++i) {
if (!dfn[i]) tarjan(i);
}
for (int i = ; i < n; ++i) {
int k1 = kind[i], k2 = kind[i+n];
if (k1 == k2) return false;
}
return true;
} void init() {
cntE = ;
memset(head, -, sizeof head);
memset(dfn, , sizeof dfn);
memset(in, false, sizeof in);
idx = top = cnt = ;
memset(ind, , sizeof ind);
memset(col, , sizeof col);
} int main()
{
//freopen("in.txt", "r", stdin); int n;
while (~scanf("%d", &n)) {
for (int i = ; i < n; ++i) {
for (int j = ; j < n; ++j) {
scanf("%d", &b[i][j]);
}
} bool fg = true; for (int i = ; i < n; ++i) {
for (int j = i; j < n; ++j) {
if (i == j) {
if (b[i][j] != ) {
fg = false;
break;
}
} else if (b[i][j] != b[j][i]) {
fg = false;
break;
}
}
if (!fg) break;
} if (!fg) {
printf("NO\n");
continue;
} for (int w = ; w <= ; ++w) {
init();
int cnt = ;
for (int i = ; i < n; ++i) {
for (int j = i+; j < n; ++j) {
//if (i == j) continue; if (i % == && j % == ) {
if (b[i][j] & ( << w)) {
addedge(i, i+n);
addedge(j, j+n);
} else {
addedge(j+n, i);
addedge(i+n, j);
}
} else if (i % == && j % == ) {
if (b[i][j] & ( << w)) {
addedge(j, i+n);
addedge(i, j+n);
} else {
addedge(i+n, i);
addedge(j+n, j);
}
} else {
if (b[i][j] & ( << w)) {
addedge(i, j+n);
addedge(j, i+n);
addedge(j+n, i);
addedge(i+n, j);
} else {
addedge(i, j);
addedge(j, i);
addedge(i+n, j+n);
addedge(j+n, i+n);
}
}
}
}
if (!topsort(n)) {
fg = false;
break;
}
} if (fg) printf("YES\n");
else printf("NO\n");
}
return ;
}

最新文章

  1. stm32新建工程详细步骤
  2. 使用js加载器动态加载外部Javascript文件
  3. VoLTE、呼叫等待(保持)
  4. I/O地址映射
  5. UVa11324 最大团 The Largest Clique-有向图强连通分量&amp;DP
  6. perl 线程创健
  7. 17--Box2D使用(三、触摸交互)
  8. Hbase 配置问题(ERROR: org.apache.hadoop.hbase.PleaseHoldException: org.apache.hadoop.hbase.PleaseHoldEx)
  9. javascript动画效果之透明度
  10. 1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(题解第二弹)
  11. ngRx 官方示例分析 - 2. Action 管理
  12. spring security 学习一
  13. 2015-10-06 认识jQuery1
  14. git的使用笔记
  15. eclipse快键
  16. python-对象与参数传递
  17. 调用聊天机器人 -小I机器人
  18. Hibernate_day01--Hibernate配置文件详解_核心api
  19. hihocoder1618 单词接龙
  20. 【chrome】在做项目使用chrome调试的时候,调整Console的位置

热门文章

  1. CodeForces 378C Maze (DFS)
  2. android异步任务详解 AsynTask
  3. Struts2 原理
  4. Phpstorm Xdebug Web程序调试
  5. jquerymobile使用技巧
  6. BZOJ 4557 侦查守卫
  7. HDU 4606 Occupy Cities ★(线段相交+二分+Floyd+最小路径覆盖)
  8. [转] gc tips(1)
  9. yii2.0 事务
  10. 预热buffer pool