1 条题解

  • 0
    @ 2025-10-8 16:51:56
    #include<bits/stdc++.h>
    using namespace std;
    const int N=2100;
    vector<int>G[N];
    int tsp, cnt, dfn[N], low[N], scc[N];
    stack<int>stk;bool instk[N];
    void tarjan(int x)
    {
        dfn[x]=low[x]=++tsp;
        stk.push(x);instk[x]=1;
        for(int y:G[x])
        {
            if(dfn[y]==0)
            {
                tarjan(y);
                low[x]=min(low[x], low[y]);
            }
            else if(instk[y])low[x]=min(low[x], dfn[y]);
        }
        if(low[x]==dfn[x])
        {
            cnt++;
            for(int z=-1;z!=x;)
            {
                z=stk.top();stk.pop();instk[z]=0;
                scc[z]=cnt;
            }
        }
    }
    int main()
    {
        int n, m;
        while(scanf("%d", &n) && n)
        {
            scanf("%d", &m);
            memset(G, 0, sizeof(G));
            for(int i=1;i<=m;i++)//构图(将点的关系简单梳理了一下)
            {
                int a1, a2, c1, c2;scanf("%d%d%d%d", &a1, &a2, &c1, &c2);//a1+c1*n 和 a2+c2*n有矛盾 
                G[a1+c1*n].push_back(a2+(c2^1)*n);
                G[a2+c2*n].push_back(a1+(c1^1)*n);
            }
            tsp=cnt=0;memset(dfn, 0, sizeof(dfn));memset(low, 0, sizeof(low));
    		memset(instk, 0, sizeof(instk));memset(scc, 0, sizeof(scc));
            for(int i=1;i<=2*n;i++)if(dfn[i]==0)tarjan(i);
    
            bool bk=1;
            for(int i=1;i<=n;i++)if(scc[i]==scc[i+n]){bk=0;break;}//夫妻不能同时选
            if(!bk)printf("NO\n");else printf("YES\n");
        }
        return 0;
    }
    
    • 1

    信息

    ID
    717
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    90
    已通过
    22
    上传者