ural1382 直接套用 2SAT模板

缩点 拓扑排序。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
//2SAT问题 准确判断矛盾边 不必考虑推出的边是否存在矛盾!!
using namespace std;
const int maxn=(1000+1);
vector<int>po[maxn*2],ps[maxn*2],strong[maxn*2];
bool vis[maxn*2],added[maxn*2][maxn*2];
int n,a[maxn],b[maxn],c[maxn],tot=0,color[maxn*2],du[maxn*2],point[maxn*2];
stack<int>s;
void add(int b,int a)
{
if(added[b][a])return;
else added[b][a]=true;
po[a].push_back(b);
ps[b].push_back(a);
}
void dfs1(int cur,int fa)
{
vis[cur]=true;
for(int i=0;i<po[cur].size();i++)
{
int np=po[cur][i];
if(np==fa||vis[np])continue;
dfs1(np,cur);
}
s.push(cur);
}
void dfs2(int cur,int co,int fa)
{
strong[co].push_back(cur);
color[cur]=co;
for(int i=0;i<ps[cur].size();i++)
{
int np=ps[cur][i];
if(np==fa||(color[np]))continue;
dfs2(np,co,cur);
}
}
void strongconnect()
{
memset(vis,0,sizeof(vis));memset(color,0,sizeof(color));
for(int i=1;i<=n*2;i++)
if(!vis[i])dfs1(i,-1);
tot=1;
while(!s.empty())
{
int np=s.top();
s.pop();
if(color[np])continue;
dfs2(np,tot++,-1);
}
}
bool cmp(int a,int b)
{
return du[a]<du[b];
}
int topo(int ans[])
{
for(int i=1;i<tot;i++)
point[i]=i;
bool anss=1;
for(int i=1;i<tot;i++)
{
sort(point+i,point+tot,cmp);
int np=point[i];
if(du[np]>0)return -1;
if(du[np]==du[point[i+1]]&&i+1<tot)anss=0;
ans[i]=np;
for(int j=0;j<ps[np].size();j++)
du[ps[np][j]]--;
}
}
int main()
{
freopen("t.txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&a[i],&b[i],&c[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)continue;
if(a[i]==a[j])
{
add(j*2,i*2-1);
add(i*2,j*2-1);
}
if(i==b[j])
{
add(i*2,j*2);
add(j*2-1,i*2-1);
}
if(b[i]==b[j])
{
add(i*2-1,j*2);
add(j*2-1,i*2);
}
if((a[i]==c[j]&&i!=b[j]))
{
add(i*2,j*2);
add(j*2-1,i*2-1);
}
}
strongconnect(); for(int i=1;i<tot;i++)
{
memset(vis,0,sizeof(vis));
ps[i].clear();
for(int j=0;j<strong[i].size();j++)
{
int np=strong[i][j];
for(int k=0;k<po[np].size();k++)
{
int nc=color[po[np][k]];
if(nc==i)continue;
if(vis[nc]){continue;}
else{vis[nc]=true;ps[i].push_back(nc);du[nc]++;}
}
}
}
int ans[maxn*2];
topo(ans);
int anss[maxn];
for(int i= tot-1;i>=1;i--)
{
int np=ans[i];
for(int i=0;i<strong[np].size();i++)
{
int npp=strong[np][i];
if(anss[(npp+1)/2]==0) anss[((npp+1)/2)]=(npp+1)%2+1;
}
}
for(int i=1;i<n;i++)
printf("%d ",anss[i]);
printf("%d\n",anss[n]);
return 0;
}

  

Ural 1382 2SAT的更多相关文章

  1. URAL - 1003:Parity (带权并查集&2-sat)

    Now and then you play the following game with your friend. Your friend writes down a sequence consis ...

  2. 【2-SAT】URAL - 2089 - Experienced coach

    题意:给出n对点a,b  要求从没对点中选出一个,且最终选出的点n个数不能存在相同的.输入数据满足每种数最多出现3次,最少出现1次 思路:第i对点的编号2*i, 2*i+1,   因为每个数最多出现3 ...

  3. 2-Sat问题

    二分+2-Sat 判断是否可行 输出字典序最小的解 输出字典序可行解 其实这些都是小问题,最重要的是建图,请看论文. 特殊的建边方式,如果a b是一对,a必须选,那么就是b->a建边. HDU ...

  4. UVALive 4849 String Phone(2-sat、01染色)

    题目一眼看去以为是4-sat... 题意:给n(n<=3000)个黑方块的坐标,保证黑方块没有公共边.对于每个黑方块选一个角作为结点,使得所选结点满足输入的一个无向图.其中距离为曼哈顿距离.输出 ...

  5. POJ 3683 Priest John's Busiest Day (2-SAT)

    题意:有n对新人要在同一天结婚.结婚时间为Ti到Di,这里有时长为Si的一个仪式需要神父出席.神父可以在Ti-(Ti+Si)这段时间出席也可以在(Di-Si)-Si这段时间.问神父能否出席所有仪式,如 ...

  6. UVa 1391 Astronauts (2SAT)

    题意:给出一些宇航员他们的年龄,x是他们的平均年龄,其中A任务只能给年龄大于等于x的人,B任务只能给小于x的人,C任务没有限制.再给出m对人,他们不能同任务.现在要你输出一组符合要求的任务安排. 思路 ...

  7. hdu 3622 Bomb Game(二分+2-SAT)

    Bomb Game Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. zoj 3717 - Balloon(2-SAT)

    裸的2-SAT,详见刘汝佳训练指南P-323 不过此题有个特别需要注意的地方:You should promise that there is still no overlap for any two ...

  9. [BZOJ 1997][HNOI2010]Planar(2-SAT)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1997 分析: 考虑每条边是在圈子里面还是圈子外面 所以就变成了2-SAT判定问题了= ...

随机推荐

  1. ruby on rails安装(win7x64)

    Ruby下载地址http://rubyinstaller.org/downloads/ (以安装2.1.7为例,2.2.3未能安装成功) 安装完之后测试是否安装成功

  2. 版本控制git之一 仓库管理 安装 基础

      版本控制git之一-仓库管理 git ​ 再开始这个话题之前,让我想起了一件很痛苦的事情,在我大学写毕业论文的时候,我当时的文件是这样保存的 毕业论文_初稿.doc 毕业论文_修改1.doc 毕业 ...

  3. c:foreach 标签 varStatus的使用

    <c:forEach items="${MedicalDoctoList }" var="medicalDoctor" varStatus="s ...

  4. 开发调式时生成dump文件

    开发调式时,对程序生成dump文件:1:需要生成的时机,加Thread.sleep(600*1000).2:打开jvisualvm找到该程序进程号.3:jmap.

  5. 九度oj 题目1062:分段函数

    题目1062:分段函数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3874 解决:2278 题目描述: 编写程序,计算下列分段函数y=f(x)的值.y=-x+2.5; 0<=x& ...

  6. Codeforces Round #304 (Div. 2)-D. Soldier and Number Game,素因子打表,超时哭晕~~

    D. Soldier and Number Game time limit per test 3 seconds memory limit per test 256 megabytes input s ...

  7. 树剖 lca

    GeneralLiu  橙边为轻边 红边为重边 绿数为每个点的 top 橙数为每个点的编号 步骤 1 先预处理 每个点的 deep深度  size子树大小  dad父节点 2 再预处理 每个点的 to ...

  8. <<编程之美>> -- 队列中取最大值操作的问题

    不得不说编程之美是一本好书,虽然很多题目在做acm中的过程中遇到过,不过还是有很多值得思考的地方 这是今天在编程之美上看到的一个问题,对于栈转化成队列的一个思考 平时都太过依赖c++内函数库中的栈和队 ...

  9. 主席树初探--BZOJ3524: [Poi2014]Couriers

    n<=500000个数,m<=500000个询问,每次问区间里出现次数>(R-L+1)的数字是谁,没有输出0. 写了带修改发现不会不带修改了.... 不带修改的话,n个点,每个点表示 ...

  10. 解决webview.getFavicon()返回值总是为空的问题

    在webview中,我们需要获取网站的favicon.ico图标,但是默认状态下,WebChromeClient中的onReceivedIcon方法获取到的icon总是为null; webview.g ...