RT,是建立虚点的方式。
不知道是不是vector的问题。
#include<bits/stdc++.h>
using namespace std;
int n,r,c,cnt;
vector<int>g[500001];
struct room{
int x,y,op;
}a[100001];
vector<int>ht[1000001],zh[1000001];
map<int,int>ry[1000001];
void makegraph()
{
for(int i=1;i<=n;i++)
{
ry[a[i].x][a[i].y]=i;
ht[a[i].x].push_back(i);
zh[a[i].y].push_back(i);
}
// for(int i=1;i<=r;i++)
// {
// printf("#%d: ",i);
// for(int j=0;j<ht[i].size();j++)printf("%d ",ht[i][j]);
// printf("\n");
// }
for(int i=1;i<=r;i++)
{
if(!ht[i].size())continue;
cnt++;
for(int j=0;j<ht[i].size();j++)
{
g[cnt].push_back(ht[i][j]);
if(a[ht[i][j]].op==1)g[ht[i][j]].push_back(cnt);
}
}
for(int i=1;i<=c;i++)
{
if(!zh[i].size())continue;
cnt++;
for(int j=0;j<zh[i].size();j++)
{
g[cnt].push_back(zh[i][j]);
if(a[zh[i][j]].op==2)g[zh[i][j]].push_back(cnt);
}
}
for(int i=1;i<=n;i++)
{
if(a[i].op!=3)continue;
int x=a[i].x,y=a[i].y;
for(int dx=-1;dx<=1;dx++)
{
for(int dy=-1;dy<=1;dy++)
{
if(dx==0&&dy==0)continue;
int p=x+dx,q=y+dy;
if(p>0&&q>0&&p<=r&&q<=c&&ry[p][q])g[i].push_back(ry[p][q]);
}
}
}
// for(int i=1;i<=cnt;i++)
// {
// for(int j=0;j<g[i].size();j++)printf("%d->%d\n",i,g[i][j]);
// }
}
int dfn[500001],low[500001],fa[500001],sz[500001],tarj;
stack<int>S;
bool inst[500001];
void init(){for(int i=1;i<=cnt;i++)fa[i]=i,sz[i]=(i<=n);}
void dfs(int now)
{
dfn[now]=low[now]=++tarj;
S.push(now);inst[now]=true;
for(int i=0;i<g[now].size();i++)
{
int to=g[now][i];
if(!dfn[to])dfs(to),low[now]=min(low[now],low[to]);
else if(inst[to])low[now]=min(low[now],dfn[to]);
}
if(dfn[now]==low[now])
{
for(;!S.empty();S.pop())
{
int son=S.top();
inst[son]=false;
if(son==now)break;
fa[son]=now;sz[now]+=sz[son];
}
S.pop();
}
}
int in[500001],f[500001];
vector<int>e[500001];
void remakegraph()
{
for(int i=1;i<=cnt;i++)
{
int fr=fa[i];
for(int j=0;j<g[i].size();j++)
{
int to=fa[g[i][j]];
if(fr==to)continue;
e[fr].push_back(to);in[to]++;
// printf("%d->%d\n",fr,to);
}
}
}
queue<int>Q;
void TPsort()
{
for(int i=1;i<=cnt;i++)
{
if(fa[i]!=i)continue;
if(!in[i])Q.push(i);
f[i]=sz[i];
}
while(!Q.empty())
{
int now=Q.front();Q.pop();
for(int i=0;i<e[now].size();i++)
{
int to=e[now][i];
f[to]=max(f[to],f[now]+sz[to]);
// printf("%d->%d %d\n",now,to,f[to]);
if(--in[to]==0)Q.push(to);
}
}
int maxn=0;
for(int i=1;i<=cnt;i++)
{
if(fa[i]==i)maxn=max(maxn,f[i]);
}
printf("%d",maxn);
}
int main()
{
scanf("%d%d%d",&n,&r,&c);cnt=n;
for(int i=1;i<=n;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].op);
makegraph();init();
for(int i=1;i<=cnt;i++)
{
if(!dfn[i])dfs(i);
}
// for(int i=1;i<=cnt;i++)printf("%d ",fa[i]);printf("\n");
remakegraph();TPsort();
return 0;
}