2-Sat+输出可行解:

 //LightOJ 1251
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
using namespace std;
int output[];
int vis[];
int low[];
int dfn[];
int print[];
int stack[];
int color[];
int pos[];
int degree[];
vector<int >mp[];
vector<int >mp2[];
int n,m,sig,cnt,tot,cont;
void add(int x,int y)
{
mp[x].push_back(y);
}
void top()
{
memset(print,,sizeof(print));
queue<int >s;
for(int i=;i<=sig;i++)
{
if(degree[i]==)
{
s.push(i);
}
}
while(!s.empty())
{
int u=s.front();
if(print[u]==)
{
print[u]=;print[pos[u]]=;
}
s.pop();
for(int i=;i<mp2[u].size();i++)
{
int v=mp2[u][i];
degree[v]--;
if(degree[v]==)s.push(v);
}
}
cont=;
for(int i=;i<=n;i++)if(print[color[i]]==)output[cont++]=i;
}
void Tarjan(int u)
{
vis[u]=;
dfn[u]=low[u]=cnt++;
stack[++tot]=u;
for(int i=;i<mp[u].size();i++)
{
int v=mp[u][i];
if(vis[v]==)Tarjan(v);
if(vis[v]==)low[u]=min(low[u],low[v]);
}
if(low[u]==dfn[u])
{
sig++;
do
{
vis[stack[tot]]=-;
color[stack[tot]]=sig;
}
while(stack[tot--]!=u);
}
}
int Slove()
{
sig=;
cnt=;
tot=-;
memset(degree,,sizeof(degree));
memset(stack,,sizeof(stack));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(vis,,sizeof(vis));
memset(color,,sizeof(color));
for(int i=;i<=n*;i++)
{
if(vis[i]==)
{
Tarjan(i);
}
}
for(int i=;i<=n;i++)
{
if(color[i]==color[i+n])return ;
pos[color[i]]=color[i+n];
pos[color[i+n]]=color[i];
}
for(int i=;i<=n*;i++)
{
for(int j=;j<mp[i].size();j++)
{
int v=mp[i][j];
if(color[i]!=color[v])
{
degree[color[i]]++;
mp2[color[v]].push_back(color[i]);
}
}
}
top();
return ;
}
int main()
{
int t;
int kase=;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
for(int i=;i<=;i++)mp[i].clear(),mp2[i].clear();
for(int i=;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
int xx=x;int yy=y;
if(x<)x=-x;
if(y<)y=-y;
if(xx>&&yy>)add(x+n,y),add(y+n,x);
if(xx>&&yy<)add(x+n,y+n),add(y,x);
if(xx<&&yy>)add(x,y),add(y+n,x+n);
if(xx<&&yy<)add(x,y+n),add(y,x+n);
}
int ans=Slove();
printf("Case %d: ",++kase);
if(ans==)
{
printf("Yes\n");
printf("%d",cont);
for(int i=;i<cont;i++)
{
printf(" %d",output[i]);
}
printf("\n");
}
else printf("No\n");
}
}

2-Sat+输出可行解(个人模版)的更多相关文章

  1. poj 2367 Genealogical tree【拓扑排序输出可行解】

    Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3674   Accepted: 2445 ...

  2. POJ 3683 Priest John&#39;s Busiest Day (2-SAT+输出可行解)

    题目地址:POJ 3683 第一次做须要输出可行解的题目. . .大体思路是先用强连通来推断是否有可行解,然后用逆序建图.用拓扑排序来进行染色.然后输出可行解. 详细思路见传送门 由于推断的时候少写了 ...

  3. Light oj 1251 - Forming the Council 【2-sat】【推断是否存在可行解 + 反向拓扑输出可行解】

    1251 - Forming the Council problem=1251" style="color:rgb(79,107,114)"> PDF (Engli ...

  4. 2-sat按照最小字典序输出可行解(hdu1814)

    Peaceful Commission Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. poj3683 2 -sat输出路径

    tarjan缩点,拓扑排序染色输出(貌似挑战上面没有拓扑啊,而且这样写还过了= =) 主要是找s,t,d,三者之间的关系,找出合取范式这题就很容易了 #include<map> #incl ...

  6. 2-sat 输出任意一组可行解&拓扑排序+缩点 poj3683

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8170   Accept ...

  7. poj 3683(2-sat+输出一组可行解)

    题目链接:http://poj.org/problem?id=3683 思路:对于每个结婚仪式,只有在开始或结束时进行这两种选择,我们可以定义xi为真当且仅当在开始时进行.于是我们可以通过时间先后确定 ...

  8. POJ 2337 输出欧拉路径

    太无语了. 这道题做了一整天. 主要还是我太弱了. 以后这个就当输出欧拉路径的模版吧. 题目中的输出字典序最小我有点搞不清楚,看了别人是这么写的.但是我发现我过不了后面DISCUSS里面的数据. 题意 ...

  9. Kettle 事务、转换内顺序、excel模版、使用踩坑

    kettle中转换和作业的执行顺序:     1.一个作业内的转换,是顺序执行的.     2.一个转换内的步骤是并行执行的.     3.作业内不支持事务,转换内支持事务. 根据业务需要,通常需要在 ...

随机推荐

  1. C#打印杨辉三角

    重主要的方法在于: 1.初始化二维数组 2.边界赋值 3.中心值赋值 4.输出 <pre name="code" class="csharp"> c ...

  2. BZOJ4970 IOI2004 empodia障碍段

    4970: [ioi2004]empodia 障碍段 Time Limit: 10 Sec  Memory Limit: 128 MB Description 古数学及哲学家毕氏相信自然之本质为数学. ...

  3. sar 命令详解

    sar (System Activity Reporter)命令是LInux下系统运行状态统计工具, 它将指定的操作系统状态计数器显示到标准输出设备. sar 工具将对系统当前的状态进行取样,然后通过 ...

  4. lesson - 8 Linux文档的压缩和打包

    内容概要:1. gzip工具语法: gzip [-d#] filename 其中#为1-9的数字,默认压缩级别为6 只能压缩文件gzip  filename 生成filename.gz 源文件消失解压 ...

  5. 第四节 mount /who / mkdir /rmdir /rm /cp /mv /touch /cat /tac/head /tail /more /less / chmod /chown /umask /chattr /lsattr /history /echo

    ***Linux下的文件类型如下: 9 8 7 6 5 4 3 2 1 0- r w x r - x r - x 第9位表示文件类型,可以为p.d.l.s.c.b和-:p表示命名管道文件 -pipe ...

  6. Windows下使用OpenSSL生成自签证书

    下载OpenSSLhttp://slproweb.com/products/Win32OpenSSL.html 生成证书 生成crt证书CMD进入安装bin目录,执行命令:openssl req -x ...

  7. 妙味课堂:JavaScript初级--第12课:json与数组

    1.json数据格式及json语法 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  8. JavaScript的DOM编程--02--获取元素节点

    如何来获取元素节点: 1) .document.getElementById: 根据 id 属性获取对应的单个节点 2) .document.getElementsByTagName: 根据标签名获取 ...

  9. SQL Server(解决问题)已成功与服务器建立连接,但是在登录过程中发生错误。(provider: Shared Memory Provider, error:0 - 管道的另一端上无任何进程。

    http://blog.csdn.net/github_35160620/article/details/52676416 如果你在使用新创建的 SQL Server 用户名和密码 对数据库进行连接的 ...

  10. Sql Server 里的向上取整、向下取整、四舍五入取整的实例!

    http://blog.csdn.net/dxnn520/article/details/8454132 =============================================== ...