玄关求条
查看原帖
玄关求条
974911
rzt123楼主2024/10/2 20:51

这题样例一直输出1,怀疑是建图出问题,不过我没检查出来。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fst ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define PII pair<int,int>
#define ft first
#define sd second
#define PII pair<int,int>
const int INF=0x3f3f3f3f,MOD=1e9+7;
const int N=1e5+10;
int n,r,c;
struct Node
{   
    int x,y,z;
    int id;
}a[N];
bool cmp1(Node a,Node b)
{
    return a.x==b.x?a.y<b.y:a.x<b.x;
}
bool cmp2(Node a,Node b)
{
    return a.y==b.y?a.x<b.x:a.y<b.y;
}
vector<Node> h,l,rod;
vector<int> g[N];
map<int,map<int,int> > mp;
int dx[]={0,1,0,-1,1,-1,-1,1};
int dy[]={1,0,-1,0,1,-1,1,-1};
int dfn[N];
int low[N];
int clr_cnt;
int clr[N];
int st[N];
int top;
int tot;
bool inst[N];
void tarjan(int u)
{
    st[++top]=u;
    inst[u]=true;
    dfn[u]=low[u]=++tot;
    for(auto v:g[u])
    {
        if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
        else if(inst[v]) low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u])
    {
        clr_cnt++;
        do
        {
            inst[st[top]]=false;
            clr[st[top]]=clr_cnt;

        }while(st[top--]!=u);
    }

}
vector<int> new_g[N];
int indeg[N];
int f[N];
signed main()
{
    fst;
    cin>>n>>r>>c;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].x>>a[i].y>>a[i].z;
        mp[a[i].x][a[i].y]=i;
        a[i].id=i;
        if(a[i].z==1)
        {
            l.push_back(a[i]);
        }
        else if(a[i].z==2)
        {
            h.push_back(a[i]);
        }
        else
        {
            rod.push_back(a[i]);
        }
    }
    sort(a+1,a+n+1,cmp1); 
    sort(h.begin(),h.end(),cmp1);
    int j=0,last=1;
    for(int i=1;i<=n&&j<h.size();i++)
    {
        if(h[j].id==a[i].id) continue;
        if(a[i].x==h[j].x)
        {
            g[h[j].id].push_back(a[i].id);
        }
        else if(a[i].z==2)
        {
            j++;
        }
        else if(a[i].x!=h[j].x) 
        {
            g[a[i].id].push_back(h[last].id);
            j++;
            last=j;
        }
    }
    j=0,last=1;
    sort(a+1,a+n+1,cmp2);
    sort(l.begin(),l.end(),cmp2);
    for(int i=1;i<=n&&j<l.size();i++)
    {
        if(l[j].id==a[i].id) continue;
        if(a[i].y==l[j].y)
        {
            g[l[j].id].push_back(a[i].id);
        }
        else if(a[i].z==1)
        {
            j++;
        }
        else if(a[i].y!=h[j].y) 
        {
            g[a[i].id].push_back(l[last].id);
            j++;
            last=j;
        }
    }
    for(int j=0;j<rod.size();j++)
    {
        for(int j=0;j<8;j++)
        {
            int nx=rod[j].x+dx[j],ny=rod[j].y+dy[j];
            if(mp[nx][ny]!=0) g[rod[j].id].push_back(mp[nx][ny]);
        }
    }
    for(int u=1;u<=n;u++)
    {
        if(!dfn[u]) tarjan(u);
    }
    for(int u=1;u<=clr_cnt;u++)
    {
        for(auto v:new_g[u])
        {
            if(clr[u]==clr[v]) continue;
            new_g[clr[u]].push_back(clr[v]);
            indeg[clr[v]]++;
        }
    }
    queue<int> q;
    for(int i=1;i<=clr_cnt;i++)
    {
        if(indeg[i]==0) q.push(i),f[i]=1;
    }
    while (!q.empty())
    {
        int u=q.front();
        q.pop();
        for(auto v:new_g[u])
        {
            f[v]=max(f[v],f[u]+1);
            if(--indeg[v]==0) q.push(v);
        }
    }
    int ans=0;
    for(int i=1;i<=clr_cnt;i++)
    {
        ans=max(ans,f[i]);
    }
    cout<<ans<<endl;
    // for(int i=1;i<=n;i++)
    // {
    //     for(auto e:g[i])
    //     {
    //         cout<<i<<" "<<e<<endl;
    //     }
    // }

    return 0;
}   
2024/10/2 20:51
加载中...