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 rspec安装

    在rubymine里新建Rails application

  2. 11.Spring通过工厂方法配置Bean

    通过工厂方法配置Bean暴扣静态工厂方法和实例工厂方法. 1.静态工厂方法 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,而不去关心创建 ...

  3. Volume 1. Sorting/Searching(uva)

    340 - Master-Mind Hints /*读了老半天才把题读懂,读懂了题输出格式没注意,结果re了两次. 题意:先给一串数字S,然后每次给出对应相同数目的的一串数字Si,然后优先统计Si和S ...

  4. [SCOI2008]奖励关 - 状压动规 - 概率与期望

    Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝 ...

  5. POJ1276 Cash Machine

    Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %lld & %llu Description A Bank pla ...

  6. [bzoj2058][Usaco2010 Nov]Cow Photographs_树状数组_动态规划

    Cow Photographs bzoj-2058 Usaco-2010 Nov 题目大意:给定一个n的排列.每次操作可以交换相邻两个数.问将序列变成一个:$i,i+1,i+2,...,n,1,2,. ...

  7. POJ1068 Parencodings 解题报告

    Description Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two diff ...

  8. CDOJ1339 郭大侠与线上游戏(维护一个set中的中位数——平衡树/双set)

    http://acm.uestc.edu.cn/#/problem/show/1339 题意:有三种操作,分别是. 1.向队列推入一个数x. 2.弹出这个队列的第一个数字 3.查询这个队列的中位数是多 ...

  9. Ubuntu 16.04升级Linux内核为4.7.0最快的方法

    升级内容有很多好处,比如支持最新硬件驱动,使系统更安装等.但是升级内容也会带来一些问题,比如一些软件的兼容性问题,从而出现一些莫名其妙的问题等,所以升级时要慎重考虑. 升级方法: 下载脚本: http ...

  10. springmvc @ResponseBody 乱码

    在spring配置文件中加入如下代码 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMet ...