题目链接

每个字符只能取小写和大写两种情况,因此满足2-sat的要求。

我们从第2个word开始,与前一个word进行比较。比较的时候从word左边的字符开始,找到左起的第一个不相同的字符(位置为pos)。

1.如果word[i-1][pos]<word[i][pos]。

那么表明如果word[i-1][pos]取小写的话,那么word[i][pos]一定要取小写。

同时word[i][pos]取大写的时候,word[i-1][pos]也一定要取大写。

于是连边(word[i-1][pos]+n) ->(word[i][pos] + n)  以及 (word[i][pos]) -> (word[i-1][pos])

2.如果word[i-1][pos] > word[i][pos]的话

表明word[i-1][pos]一定要取大写,word[i][pos]一定要取小写。

即:

word[i-1][pos] -> word[i-1][pos] +n

word[i][pos]+n->word[i-1][pos]

note:

+n代表大写

不加代表小写

题解:

#include <bits/stdc++.h>
using namespace std;
using namespace std;
const int maxn = 1e6;
int head[maxn];
int DFN[maxn],LOW[maxn],stk[maxn],visit[maxn],belong[maxn];
vector<int> scc[maxn];
int tot,idx,cnt,sccnum;
int n,color[maxn],degree[maxn],pos[maxn];
struct Es{ int v; int next; int cost;
}Es[maxn<<1];
vector<int> bkG[maxn];
void init(){ sccnum = tot = idx = cnt = 0; memset(head,-1,sizeof(head)); memset(DFN,0,sizeof(DFN)); memset(LOW,0,sizeof(LOW)); memset(visit,0,sizeof(visit)); memset(color,0,sizeof(color)); memset(degree,0,sizeof(degree));memset(pos,0,sizeof(pos));for(int i = 0;i < maxn;i++) scc[i].clear();for(int i = 0;i < maxn;++i) bkG[i].clear();
}
inline void add_edge(int i,int j,int cost = 1){   Es[cnt].v = j; Es[cnt].cost = cost; Es[cnt].next = head[i]; head[i] = cnt++;
}
void tarjan(int x)
{DFN[x]=LOW[x]=++tot;stk[++idx]=x;visit[x]=1;for(int i=head[x];i!=-1;i=Es[i].next){if(!DFN[Es[i].v]) {tarjan(Es[i].v);LOW[x] = min(LOW[x],LOW[Es[i].v]);}else if(visit[Es[i].v ]){  LOW[x] = min(LOW[x],DFN[Es[i].v]);}}if(LOW[x]==DFN[x]){++sccnum;do{int item = stk[idx];belong[item] = sccnum;scc[sccnum].push_back(item);visit[item]=0;idx--;}while(x!=stk[idx+1]);}return ;
}
bool check(){for(int i = 1;i <= n;i++){if(belong[i] == belong[i+n]) return false;}return true;
}
bool solve(){for(int i = 1;i <= 2*n;++i )if(!DFN[i]) tarjan(i);if(!check()) return false;for(int i = 1;i <= n;++i){if(!pos[belong[i]]){pos[belong[i]] = belong[i+n];pos[belong[i+n]] = belong[i];}}for(int i = 1;i <= 2*n;++i){for(int e = head[i];e != -1;e = Es[e].next){int v = Es[e].v;if(belong[i] != belong[v]){degree[belong[i]]++;bkG[belong[v]].push_back(belong[i]);}}}queue<int> que;for(int i = 1;i <= sccnum;++i){if(!degree[i])que.push(i);}while(!que.empty()){int u = que.front();que.pop();if(!color[u]){color[u] = 1;color[pos[u]] = 2;}for(int i = 0;i < bkG[u].size();++i){int v = bkG[u][i];degree[v]--;if(!degree[v])que.push(v);}}vector<int> ans;for(int i = 1;i <= n;++i){if(color[belong[i]] != 1) {//Yesans.push_back(i);}} printf("Yes\n%d\n",ans.size());for(int i = 0;i < ans.size();++i){printf("%d ",ans[i]);}return true;
}
int m;
vector<int> vec[maxn];
int main(){init();scanf("%d%d",&m,&n);for(int i = 0;i < m;++i){int num;scanf("%d",&num);for(int j = 0;j < num;++j){int x;scanf("%d",&x);vec[i].push_back(x);}}int f = 1;for(int i = 1;i < m;++i){int id = 0;while(id < vec[i-1].size() && id < vec[i].size() && vec[i-1][id] == vec[i][id]) ++id;if(id >= vec[i-1].size() || id >= vec[i].size()){if(vec[i-1].size() <= vec[i].size()) continue;else{f = 0;break;}}else if(vec[i-1][id] < vec[i][id]){add_edge(vec[i][id]+n,vec[i-1][id]+n);add_edge(vec[i-1][id],vec[i][id]);}else{add_edge(vec[i][id]+n,vec[i][id]);add_edge(vec[i-1][id],vec[i-1][id]+n);}}if(!f || !solve()){puts("No");}return 0;
}

codeforces National Property 2sat模板题相关推荐

  1. HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题)...

    HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题) Description T ...

  2. codeforces 427C tarjan模板题

    题意: 给你n个点每个点修建警察局的cost 对于这张图来说,与警察局在同一强联通分量里的每个点都可以被这个警察局照看  问你最小cost以及当前cost的方案数 思路: tarjan模板题~~~ ( ...

  3. 图论-有向图的连通性模板题(hdu1296)(hdu1827)

    1.强连通分量: 强连通分量可以理解为边数最少的情况下是一个环. 这里写了一个模板题用的是tarjan算法,当然还有其他算法. tarjan算法的关键其实还是对于num数组和low数组的使用 然后可以 ...

  4. P1339 热浪 最短路径模板题

    这么naive的题面一看就是最短路模板题~~~ ok.首先是floyd算法,tts,记得把k放在最外面就行了. 1 #include <cstdio> 2 #include <cst ...

  5. HDU2255 奔小康赚大钱(km模板题)

    Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.         这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓, ...

  6. HDU1166 敌兵布阵(树状数组模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. 数单词 (AC自动机模板题)

    数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...

  8. CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题

    题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...

  9. hdu 2191 悼念512汶川大地震遇难同胞 【多重背包】(模板题)

    题目链接:https://vjudge.net/problem/HDU-2191 悼念512汶川大地震遇难同胞--珍惜现在,感恩生活                                   ...

最新文章

  1. 跨链Cosmos(3)IBC协议
  2. ITK:向索引添加偏移量
  3. RabbitMQ报错NOT_ALLOWED - access to vhost ‘/‘ refused for user ‘zq‘(10, 40)
  4. 全国计算机等级考试收费不一样,2018年北京全国计算机等级考试收费标准
  5. 一些SAP UI5代码审查的例子
  6. ARM立即数讲解--LDR和MOV的区别 .
  7. MySQL流浪记(七)—— MySQL删除表数据
  8. easyui php 拖动排序,Easyui 自定义排序_EasyUI 教程
  9. YARN组件详细介绍
  10. MATLAB GUI的界面归一化问题
  11. SVN客户端安装与使用
  12. vb.NET 关于进度条控件使用
  13. Python TKinter下拉日历控件
  14. css样式实现居中对齐
  15. Monte-Carlo(蒙特卡罗)算法
  16. Altium-Designer6.9安装报错Application Error
  17. 中望3D2022 参考几何体
  18. 嵌入式开发常用英语单词--你知多少?
  19. 自行车LED灯导航仪推出 配自行车专用地图
  20. IDEA 运行 Junit 测试用例报 !!! JUnit version 3.8 or later expected 错误

热门文章

  1. mac 配置php和mysql_Mac下配置PHP+MySql环境
  2. 算法题目——第K大的数
  3. 算法设计与分析——算法思想总结
  4. 69. Sqrt(x)010(二分法求解+详解注释)
  5. 每天一小时python官方文档学习(一)————python的简单介绍
  6. C++关于getline()和getchar()的小点
  7. [蓝桥杯2015决赛]分机号-枚举(水题)
  8. java 第三方序列化,11.既然有第三方的序列化方式,说明java官方提供的序列化方式应该有一些很明显或者很致命的缺点……...
  9. 2019-03-13-算法-进化(验证回文串)
  10. 2019ICPC西安邀请赛 E. Tree(树剖 + 线段树)