这题样例一直输出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;
}