2 条题解
-
1
#include <bits/stdc++.h> using namespace std; const int maxn = 4e5 + 5; int n, m, A, B, C, dfn[maxn], low[maxn], ts, fa[maxn], idx; bool vis[maxn]; vector<int> g[maxn], G[maxn]; stack<int> stk; void tarjan(int u) { dfn[u] = low[u] = ++ts; stk.push(u); for (auto v : g[u]) { if (!dfn[v]) { tarjan(v); low[u] = min(low[u], low[v]); if (low[v] == dfn[u]) { idx++; G[u].push_back(idx); fa[idx] = u; int x; do { x = stk.top(); stk.pop(); G[idx].push_back(x); fa[x] = idx; } while (x != v); } } else { low[u] = min(low[u], dfn[v]); } } } int main() { scanf("%d%d%d%d%d", &n, &m, &A, &B, &C); idx = n; // 每创建一个新的方点,++idx for (int i = 0, u, v; i < m; i++) { scanf("%d%d", &u, &v); g[u].push_back(v); g[v].push_back(u); } tarjan(A); for (int u = fa[C]; u != A; u = fa[u]) vis[u] = true; bool flag = false; if (vis[ fa[B] ]) flag = true; for (auto u : G[B]) if (vis[u]) flag = true; puts(flag ? "Yes" : "No"); return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N=4e5+10; int id,cnt,dfn[N],low[N],fa[N]; bool v[N]; vector<int>e[N],e2[N]; stack<int>stk; void tarjan(int x) { dfn[x]=low[x]=++cnt; stk.push(x); for(int y:e[x]) { if(!dfn[y]) { tarjan(y); low[x]=min(low[x],low[y]); if(low[y]==dfn[x]) { e2[x].push_back(++id); fa[id]=x; for(int z=-1;z!=y;) { z=stk.top();stk.pop(); e2[id].push_back(z); fa[z]=id; } } } else low[x]=min(low[x],dfn[y]); } } int main() { int n,m,a,b,c;scanf("%d%d%d%d%d",&n,&m,&a,&b,&c); id=n; for(int i=1,x,y;i<=m;i++) { scanf("%d%d",&x,&y); e[x].push_back(y); e[y].push_back(x); } tarjan(a); for(int x=fa[c];x!=a;x=fa[x])v[x]=1; bool book=0; if(v[fa[b]])book=1; for(int x:e2[b]) if(v[x])book=1; if(book)puts("Yes"); else puts("No"); return 0; }
- 1
信息
- ID
- 8849
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 7
- 标签
- 递交数
- 34
- 已通过
- 9
- 上传者