1924: [Sdoi2010]所驼门王的宝藏

来源:互联网 发布:淘宝网怎么没有一淘了 编辑:程序博客网 时间:2024/05/16 19:46

题意

不想写了。。

题解

一开始想拆点,然后费用流。。
然后发现环很难搞。。
果断弃疗。。
于是想到要是是环的话,缩点是肯定可以的。。
然后我们就随便dfs一下就好了。。

CODE:

#include<cstdio>#include<map>#include<cstring>#include<algorithm>#include<iostream>using namespace std;const int MAX=1<<30;const int N=100005;const int M=1000005;int n,r,c;int X[N],Y[N],C[N];map<int,map<int,int> > m;struct qq{    int x,y,last;}s[N*10];int num,last[N];int xx[8]={-1,-1,-1,0,0,1,1,1};int yy[8]={-1,0,1,-1,1,-1,0,1};void init (int x,int y){    num++;    s[num].x=x;s[num].y=y;    s[num].last=last[x];    last[x]=num;}int A[M],B[M];int dfn[N],low[N],belong[N],cnt,sta[N],lalal,shen;bool in[N];int TT[N];int mymin (int x,int y){return x<y?x:y;}int mymax(int x,int y){return x>y?x:y;}void dfs1 (int x){    dfn[x]=low[x]=++lalal;    sta[++cnt]=x;    in[x]=true;    for (int u=last[x];u!=-1;u=s[u].last)    {        int y=s[u].y;        if (dfn[y]==-1)        {            dfs1(y);            low[x]=mymin(low[x],low[y]);        }        else if (in[y]) low[x]=mymin(dfn[y],low[x]);    }    if (low[x]==dfn[x])    {        shen++;TT[shen]=0;        int now;        do        {            now=sta[cnt--];            belong[now]=shen;            in[now]=false;            TT[shen]++;        }while (now!=x);    }}int f[N];int dfs (int x){    if (f[x]!=0) return f[x];    f[x]=TT[x];    for (int u=last[x];u!=-1;u=s[u].last)    {        int y=s[u].y;        f[x]=mymax(f[x],TT[x]+dfs(y));    }    return f[x];}int main(){    num=0;memset(last,-1,sizeof(last));    memset(A,-1,sizeof(A));    memset(B,-1,sizeof(B));    scanf("%d%d%d",&n,&r,&c);    for (int u=1;u<=n;u++)    {        scanf("%d%d%d",&X[u],&Y[u],&C[u]);        m[X[u]][Y[u]]=u;        if (A[X[u]]==-1&&C[u]==1) A[X[u]]=u;        if (B[Y[u]]==-1&&C[u]==2) B[Y[u]]=u;    }    for (int u=1;u<=n;u++)    {        if (A[X[u]]!=-1) init(A[X[u]],u);        if (B[Y[u]]!=-1) init(B[Y[u]],u);        if (C[u]==3)        {            for (int i=0;i<=8;i++)            {                int fx=X[u]+xx[i],fy=Y[u]+yy[i];                if (m.count(fx)!=0&&m[fx].count(fy)!=0)                    init(u,m[fx][fy]);            }        }        if (C[u]==2&&B[Y[u]]!=-1) init(u,B[Y[u]]);        if (C[u]==1&&A[X[u]]!=-1) init(u,A[X[u]]);    }    shen=lalal=cnt=0;    memset(dfn,-1,sizeof(dfn));    memset(in,false,sizeof(in));    for (int u=1;u<=n;u++)        if (dfn[u]==-1)            dfs1(u);    int num1=num;memset(last,-1,sizeof(last));num=0;    for (int u=1;u<=num1;u++)        if (belong[s[u].x]!=belong[s[u].y])            init(belong[s[u].x],belong[s[u].y]);    int ans=0;    for (int u=1;u<=shen;u++)   ans=mymax(ans,dfs(u));    printf("%d\n",ans);    return 0;}