Ural 1382 2SAT
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的更多相关文章
- URAL - 1003:Parity (带权并查集&2-sat)
Now and then you play the following game with your friend. Your friend writes down a sequence consis ...
- 【2-SAT】URAL - 2089 - Experienced coach
题意:给出n对点a,b 要求从没对点中选出一个,且最终选出的点n个数不能存在相同的.输入数据满足每种数最多出现3次,最少出现1次 思路:第i对点的编号2*i, 2*i+1, 因为每个数最多出现3 ...
- 2-Sat问题
二分+2-Sat 判断是否可行 输出字典序最小的解 输出字典序可行解 其实这些都是小问题,最重要的是建图,请看论文. 特殊的建边方式,如果a b是一对,a必须选,那么就是b->a建边. HDU ...
- UVALive 4849 String Phone(2-sat、01染色)
题目一眼看去以为是4-sat... 题意:给n(n<=3000)个黑方块的坐标,保证黑方块没有公共边.对于每个黑方块选一个角作为结点,使得所选结点满足输入的一个无向图.其中距离为曼哈顿距离.输出 ...
- POJ 3683 Priest John's Busiest Day (2-SAT)
题意:有n对新人要在同一天结婚.结婚时间为Ti到Di,这里有时长为Si的一个仪式需要神父出席.神父可以在Ti-(Ti+Si)这段时间出席也可以在(Di-Si)-Si这段时间.问神父能否出席所有仪式,如 ...
- UVa 1391 Astronauts (2SAT)
题意:给出一些宇航员他们的年龄,x是他们的平均年龄,其中A任务只能给年龄大于等于x的人,B任务只能给小于x的人,C任务没有限制.再给出m对人,他们不能同任务.现在要你输出一组符合要求的任务安排. 思路 ...
- hdu 3622 Bomb Game(二分+2-SAT)
Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- zoj 3717 - Balloon(2-SAT)
裸的2-SAT,详见刘汝佳训练指南P-323 不过此题有个特别需要注意的地方:You should promise that there is still no overlap for any two ...
- [BZOJ 1997][HNOI2010]Planar(2-SAT)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1997 分析: 考虑每条边是在圈子里面还是圈子外面 所以就变成了2-SAT判定问题了= ...
随机推荐
- CODE【VS】3160 最长公共子串 (后缀自动机)
3160 最长公共子串 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入描述 Input Description 读入两个字符串 输出描述 Outp ...
- MSP430F5529时钟系统深究
1.为什么要进行时钟管理? 时钟系统是一个数字器件的命脉,对于普通的51单片机来说,它的时钟来源只有外部晶振,然后每12个振荡周期完成一个基本操作,所以也叫做12T单片机,但对于当前高级一点的单片机来 ...
- 【Codeforces 1086B】Minimum Diameter Tree
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 统计叶子节点个数m 把每条和叶子节点相邻的边权设置成s/cnt就可以了 这样答案就是2*s/m(直径最后肯定是从一个叶子节点开始,到另外一个叶 ...
- JavaEE JDBC PreparedStatement
PreparedStatement @author ixenos PreparedStatement工作原理 注意:虽然mysql不支持PreparedStatement优化,但依然有预编译的实现! ...
- mariadb,maria db
mariadb,maria db 继续紧逼Oracle:在占领谷歌等公司之后,MariaDB迈向企业端 发表于2013-10-25 13:00|10618次阅读|10条评论 MariaDB在Googl ...
- bat初学
今天在重置某工具软件试用期时(汗,盗版可耻=_=!,鄙视自己一下),实在懒得每次过了试用期再点开注册表,手工删除了,就想着写个脚本执行一下,这里就想起来了bat文件. 首先介绍一下for循环,从百度知 ...
- 51nod 1010 只包含因子2 3 5的数 && poj - 1338 Ugly Numbers(打表)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1010 http://poj.org/problem?id=1338 首先 ...
- fastjson过滤器简单记录
fastjson过滤器,该字段可以将转化的json字段遍历,方便实用 1 /** * 通用输出json * @param object * @return json字符串 */ public Stri ...
- Ubuntu 16.04升级4.7.0内核后导致Compiz奔溃,问题:compiz[4852]: segfault at 48 ip 00007f88cae087f0 sp 00007ffce354c268 error 4 in libscale.so
由于硬件的驱动支持问题,升级4.7.0的内核主要是为了能使用Intel HD Graphics 630驱动,但是也出现了相关问题,比如Compiz的特效导致桌面上如果有多个相同程序启动,然后再次点击时 ...
- JFinal Weixin 微信极速 SDK
原文:https://git.oschina.net/jfinal/jfinal-weixin