P4171 [JSOI2010] 满汉全席 2-SAT
P4171 [JSOI2010] 满汉全席 2-SAT
思路:
2-SAT模板题,我们将满席定为1,汉席定为0.那么建边即可。判断同一道菜满汉是否在强联通分量中即可。
注意多测清空!!!
代码:
vector<int> e[N];
stack<int> stk;
int dfn[N],low[N],tot;
int instk[N],scc[N],siz[N],cnt;
int n,m;
void tarjan(int u){
dfn[u]=low[u]=++tot;
stk.push(u);instk[u]=1;
for(auto v:e[u]){
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(instk[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
int v;++cnt;
do{
v=stk.top();
stk.pop();
instk[v]=0;
scc[v]=cnt;
siz[cnt]++;
}while(v!=u);
}
}
void init(){
tot=0,cnt=0;
for(int i=0;i<2*n;i++){
e[i].clear();
instk[i]=0;
dfn[i]=low[i]=0;
}
for(int i=1;i<=cnt;i++){
siz[i]=0;
scc[i]=0;
}
}
void Showball(){
cin>>n>>m;
init();
while(m--){
char x,y;
int u,v;
cin>>x>>u>>y>>v;
u--;v--;
e[(u<<1)+!(x=='m')].pb((v<<1)+(y=='m'));
e[(v<<1)+!(y=='m')].pb((u<<1)+(x=='m'));
}
for(int i=0;i<2*n;i++){
if(!dfn[i]) tarjan(i);
}
for(int i=0;i<n;i++){
if(scc[i<<1]==scc[i<<1|1]) return cout<<"BAD\n",void();
}
cout<<"GOOD\n";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!