记住几个最重要的公式:

xANDy=0<=>(x=>y′)AND(y=>x′)

xANDy=1<=>(x′=>x)AND(y′=>y)

xORy=0<=>(x=>x′)AND(y=>y′)

xORy=1<=>(x′=>y)AND(y′=>x)

xXORy=0<=>(x′=>y′)AND(x=>y)AND(y=>x)AND(y′=>x′)

xXORy=1<=>(x=>y′)AND(x′=>y)AND(y=>x′)AND(y′=>x)

连边 缩环 判一判是不是在一个环里(拓扑输出方案)

POJ 3207

这道题是X xor Y=1的形式

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=;
int n,m,first[N],next[N],v[N],tot,T,cnt,jy,low[N],dfn[N],vis[N],stk[N],top,p[N];
struct Nod{int from,to;}node[N];
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void addedge(int x,int y){add(x+n,y),add(x,y+n),add(y,x+n),add(y+n,x);}
void tarjan(int x){
low[x]=dfn[x]=++cnt;vis[x]=;stk[++top]=x;
for(int i=first[x];~i;i=next[i]){
if(!dfn[v[i]])tarjan(v[i]),low[x]=min(low[x],low[v[i]]);
else if(vis[v[i]])low[x]=min(low[x],dfn[v[i]]);
}
if(low[x]==dfn[x]){
T++;
do{
jy=stk[top--],vis[jy]=;p[jy]=T;
}while(jy!=x);
}
}
int main(){
memset(first,-,sizeof(first));
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d%d",&node[i].from,&node[i].to);
if(node[i].from>node[i].to)swap(node[i].from,node[i].to);
}
for(int i=;i<=m;i++){
for(int j=;j<=m;j++){
if(i!=j&&node[j].from>=node[i].from&&node[j].from<=node[i].to&&node[j].to>=node[i].to)addedge(i,j);
}
}
for(int i=;i<=*n;i++)if(!dfn[i])tarjan(i);
for(int i=;i<=m;i++){
if(p[node[i].from]==p[node[i].to]){puts("the evil panda is lying again");return ;}
}puts("panda is telling the truth...");
}

POJ 3683

如果时间冲突-> X AND Y =0

(有一些trick省略了拓扑)

若缩完环以后i<i+n 就是开始

否则是结束

//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=,M=*;
int n,x1,y1,x2,y2,dfn[N],low[N],vis[N],p[N],v[M],next[M],first[N],tot,cnt,stk[N],top,T,jy;
struct Node{int begin,end,last;}node[N];
void add(int x,int y){v[++tot]=y,next[tot]=first[x],first[x]=tot;}
bool check(int a,int b,int c,int d){return !(b<=c||d<=a);}
void tarjan(int x){
dfn[x]=low[x]=++cnt,vis[x]=,stk[++top]=x;
for(int i=first[x];i;i=next[i])
if(!dfn[v[i]])tarjan(v[i]),low[x]=min(low[x],low[v[i]]);
else if(vis[v[i]])low[x]=min(low[x],dfn[v[i]]);
if(low[x]==dfn[x]){T++;do jy=stk[top--],vis[jy]=,p[jy]=T;while(jy!=x);}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d:%d%d:%d%d",&x1,&y1,&x2,&y2,&node[i].last),
node[i].begin=x1*+y1,node[i].end=x2*+y2;
for(int i=;i<=n;i++)
for(int j=;j<i;j++){
if(check(node[i].begin,node[i].begin+node[i].last,node[j].begin,node[j].begin+node[j].last))add(i,j+n),add(j,i+n);
if(check(node[i].begin,node[i].begin+node[i].last,node[j].end-node[j].last,node[j].end))add(i,j),add(j+n,i+n);
if(check(node[i].end-node[i].last,node[i].end,node[j].begin,node[j].begin+node[j].last))add(i+n,j+n),add(j,i);
if(check(node[i].end-node[i].last,node[i].end,node[j].end-node[j].last,node[j].end))add(i+n,j),add(j+n,i);
}
for(int i=;i<=*n;i++)if(!dfn[i])tarjan(i);
for(int i=;i<=n;i++)if(p[i]==p[i+n]){puts("NO");return ;}
puts("YES");
for(int i=;i<=n;i++){
if(p[i]<p[i+n])printf("%02d:%02d %02d:%02d\n",node[i].begin/,node[i].begin%,(node[i].begin+node[i].last)/,(node[i].begin+node[i].last)%);
else printf("%02d:%02d %02d:%02d\n",(node[i].end-node[i].last)/,(node[i].end-node[i].last)%,node[i].end/,node[i].end%);
}
}

最新文章

  1. 让 OpenAL 也支持 S16 Planar(辅以 FFmpeg)
  2. mock测试到底是什么?
  3. 自己对Extjs的Xtemplate的忽略
  4. 公共事件处理函数js库
  5. Java 序列化Serializable接口
  6. Eclipse 高亮显示选中的相同变量
  7. 《Java程序设计》实验三 实验报告
  8. 字符串匹配的sunday算法
  9. python中的gil是什么?
  10. python Post方式发起http请求 使用百度接口地理编码
  11. JAVA的对象和引用——一个真实遇到的问题
  12. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
  13. 安装python2.7.13-64bit &amp; Pycharm在两个python版本之间切换
  14. 关于我的PP0.1聊天软件(客户端)
  15. left join 条件位置问题
  16. dojo表格分页之各个参数代表的意义(一)
  17. FFmpeg的HEVC解码器源代码简单分析:环路滤波(Loop Filter)
  18. 架构之微服务(zookeeper)
  19. OpenCV中Mat总结
  20. Mac 中 PyCharm 配置 Anaconda环境

热门文章

  1. css页面布局总结
  2. Xilinx FPGA的专用时钟引脚及时钟资源相关
  3. .net 学习视频
  4. uva 133(The Dole Queue UVA - 133)
  5. everyday two problems / 3.1
  6. Java基础学习总结(74)——Java常见笔试题及答案汇总
  7. Git学习总结(13)——使用git.oschina作为自己的源代码在线管理库
  8. pam_cracklib.so模块
  9. Master Nginx(8) - Troubleshooting Techniques
  10. 清北学堂模拟赛d6t1 角谷猜想