2 条题解

  • 1
    @ 2026-2-1 23:30:26
    #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
      @ 2026-2-4 16:32:49
      #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
      上传者