BZOJ 1143 祭祀 river(最大独立集)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1143

题意:给出一个有向无环图。在其中找出一个最大的点集使得点集中任意两个点之间不可达。

思路:首先在给出图中跑一次floyd,这样g[i][j]=1则i可到达j。那么题意就是求最大独立集。最大独立集=|G|-最小顶点覆盖=|G|-二分图最大匹配。

 

int g[N][N],match[N],visit[N];

int n;





int DFS(int u)

{

    int i;

    FOR1(i,n) if(!visit[i]&&g[u][i])

    {

        visit[i]=1;

        if(match[i]==-1||DFS(match[i]))

        {

            match[i]=u;

            return 1;

        }

    }

    return 0;

}





int m;





int main()

{

    RD(n,m);

    int i,x,y;

    FOR1(i,m)

    {

        RD(x,y);

        g[x][y]=1;

    }

    int j,k;

    FOR1(k,n) FOR1(i,n) FOR1(j,n) if(g[i][k]&&g[k][j])

    {

        g[i][j]=1;

    }

    clr(match,-1);

    int ans=0;

    FOR1(i,n)

    {

        clr(visit,0);

        if(DFS(i)) ans++;

    }

    PR(n-ans);

}

 

 

 

你可能感兴趣的:(ZOJ)