大意:n个点 m个条件 形如m1,h32,满足n个条件
思路:2-sat 让m=0,h=1 ,然后转换为i m j h的建图,注意傻逼题目的数字可能是多位数 不能直接x[1]-'0'
| #include <cstdio> |
| #include <stack> |
| #include <iostream> |
| #include <cstring> |
| #include <cmath> |
| #include <algorithm> |
| #define ep emplace_back |
| |
| #define ios std::ios::sync_with_stdio(false);std::cin.tie(0); |
| const int N = 1e5+9; |
| |
| using namespace std; |
| |
| int trans(char x){ |
| return x == 'm' ? 0 : 1; |
| } |
| |
| int num(string x){ |
| int ans=0; |
| int len = x.size()-1; |
| for(int i=1 ; i<x.size();++i){ |
| int ch =x[i]-'0'; |
| ans+=ch*pow(10,len-1); |
| --len; |
| } |
| return ans; |
| } |
| int n, m; |
| int head[N], idx = 0; |
| int time__; |
| int low[N], dfn[N]; |
| struct node{ |
| int to, val, next; |
| } e[N<<2]; |
| bool vis[N]; |
| int scc[N], scc_cnt = 0; |
| |
| void add(int u, int v, int val){ |
| e[idx] = {v, val, head[u]}; |
| head[u] = idx++; |
| } |
| |
| void bd(){ |
| cin >> n >> m; |
| for(int k = 1; k <= m; ++k){ |
| string ch1, ch2; |
| cin >> ch1 >> ch2; |
| int i = num(ch1); |
| int j = num(ch2); |
| int a = trans(ch1[0]); |
| int b = trans(ch2[0]); |
| |
| add(i + a * n, j + !b * n, 0); |
| add(j + b * n, i + !a * n, 0); |
| } |
| } |
| |
| stack<int> st; |
| void tarjan(int u){ |
| low[u] = dfn[u] = ++time__; |
| st.push(u); |
| vis[u] = 1; |
| for(int i = head[u]; i != -1; i = e[i].next){ |
| int v = e[i].to; |
| if(!dfn[v]){ |
| tarjan(v); |
| low[u] = min(low[u], low[v]); |
| } |
| else if(vis[v]){ |
| low[u] = min(low[u], dfn[v]); |
| } |
| } |
| if(dfn[u] == low[u]){ |
| scc_cnt++; |
| while(true){ |
| int v = st.top(); |
| st.pop(); |
| vis[v] = 0; |
| scc[v] = scc_cnt; |
| if(u == v) break; |
| } |
| } |
| } |
| |
| void clear(){ |
| memset(head, -1, sizeof head); |
| memset(scc, 0, sizeof scc); |
| memset(vis, 0, sizeof vis); |
| memset(low, 0, sizeof low); |
| memset(dfn, 0, sizeof dfn); |
| while(!st.empty()) st.pop(); |
| time__ = 0, idx = 0, scc_cnt = 0; |
| } |
| |
| void solve(){ |
| clear(); |
| bd(); |
| |
| for(int i = 1; i <= 2 * n; ++i) |
| if(!dfn[i]) |
| tarjan(i); |
| bool ok = 1; |
| for(int i = 1; i <= n; ++i){ |
| if(scc[i] == scc[i + n]){ |
| ok = 0; |
| break; |
| } |
| } |
| |
| cout << (ok ? "GOOD" : "BAD") ; |
| cout<< "\n"; |
| } |
| |
| int main(){ |
| ios; |
| int T = 1; |
| cin >> T; |
| while(T--){ |
| solve(); |
| } |
| return 0; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具