[BZOJ 1143][CTSC 2008]祭祀river(二分图最大独立集)

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1143

这是我做的第一道CTSC的题,这题水得我都惊呆了。。。据说BZOJ只有第一问,没有问第二问,因为没数据,难怪这么水。。。

首先我们得知道二分图的独立集的概念:

二分图的独立集是二分图中一个任意两点都不相连的顶点的集合

二分图的最大独立集求法:

二分图的最大独立集=二分图点数-二分图最大匹配

然后这题就好做了。首先我们用Floyd求出相互可达的点的点对,然后用这些点对建立一个二分图,这个二分图中,有边相连的两个点都是相互可达的。然后我们求二分图的最大独立集即可。得到的二分图最大独立集中,任意两点之间均不可达。

注意边的个数要开n^2个!因为极限情况是任意两点之间均可达

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>

#define MAXV 110
#define MAXE 100100

using namespace std;

struct edge
{
    int u,v,next;
}edges[MAXE];

int head[MAXV],nCount=0;
int dist[MAXV][MAXV],n,m;
int linky[MAXV];
bool visit[MAXV];

void AddEdge(int U,int V)
{
    edges[++nCount].u=U;
    edges[nCount].v=V;
    edges[nCount].next=head[U];
    head[U]=nCount;
}

bool dfs(int u)
{
    for(int p=head[u];p!=-1;p=edges[p].next)
    {
        int v=edges[p].v;
        if(visit[v]) continue;
        visit[v]=true;
        if(linky[v]==-1||dfs(linky[v]))
        {
            linky[v]=u;
            return true;
        }
    }
    return false;
}

int main()
{
    memset(head,-1,sizeof(head));
    memset(linky,-1,sizeof(linky));
    scanf("%d%d",&n,&m);
    int ans=n;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        dist[x][y]=1;
    }
    for(int k=1;k<=n;k++) //Floyd预处理,求出u能到达v的点对(u,v);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                dist[i][j]|=dist[i][k]&dist[k][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i!=j)
                if(dist[i][j])
                    AddEdge(i,j);
    for(int i=1;i<=n;i++)
    {
        memset(visit,false,sizeof(visit));
        if(dfs(i)) ans--;
    }
    printf("%d\n",ans);
    return 0;
}



时间: 2024-08-01 04:15:52

[BZOJ 1143][CTSC 2008]祭祀river(二分图最大独立集)的相关文章

【bzoj 1143】[CTSC2008]祭祀river

Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河道连接着两个岔口,并且水在河道内按照一个固定的方向流动.显然,水系中不会有环流(下图描述一个环流的例子). 由于人数众多的原因,Y族的祭祀活动会在多个岔口上同时举行.出于对龙王的尊重,这些祭祀地点的选择必须非常慎重.准确地说,Y族人认为,如果水流可以从一个祭祀点流到另外一个祭祀点,那么

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,

BZOJ 1143 CTSC2008 祭祀river 二分图最大匹配

题目大意:给定一个拓扑图,求一个最大的点集,点集中的点两两不可达 这实际上就是让你求传递闭包后图的最大点独立集- - 利用二分图最大匹配就能搞- - #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 110 using namespace std; int n,m,ans; bool map[M][M]; int state[M],r

[1143] [CTSC2008]祭祀river(最大独立集 || 偏序集最大反链)

传送门 网上说这是偏序集最大反链,然而我实在不理解. 所以我换了一个思路,先用floyed,根据点的连通性连边, 问题就转换成了找出最多的点,使任意两个点之间不连边,也就是最大独立集. ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 const int MAXN = 101; 6 int n, m, ans, cnt; 7 int a[MAXN][MAXN], belong[

[图论训练]1143: [CTSC2008]祭祀river 二分图匹配

Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在 水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河道连接着两个岔口,并且水在河道内按照一个固定的 方向流动.显然,水系中不会有环流(下图描述一个环流的例子). 由于人数众多的原因,Y族的祭祀活动会在多个岔口上同时举行.出于对龙王的尊重,这些祭祀地点的选择必须非常慎重.准确地说,Y族人认为,如果水流 可以从一个祭祀点流到另外一个祭祀点

BZOJ 1146 CTSC 2008 网络管理 Network 树链剖分+二分答案+平衡树

题目大意:有n个路由器,他们由n-1条边连接(形成一棵树).每一个路由器有一个延时值.有两种操作: 1.查询树上x,y两点之间的路径上第k大的权值是多少 2.修改x位置的权值为y 思路:当我大概想到怎么做这个题的时候,所想的时间复杂度已经达到了O(nlog^4n),偷偷的瞄了一眼数据范围...(N,Q<=80000,时限50s,小心翼翼的掏出计算器算了一下:8w * log(8w) ^  4 ≈ 56E,心中这样想着:Treap有常数,链剖常数大,二分不稳定的范围好像不止8w...评测机会不会很

BZOJ 1617 Usaco 2008 Mar. River Crossing渡河问题

[题解] 显然是个DP题. 设$f[i]$表示送$i$头牛过河所需的最短时间,预处理出$t[i]$表示一次性送i头牛过河所需时间,那么我们可以得到转移方程:$f[i]=min(f[i],f[i-j]+t[j]+t[0])$ (这里的$t[0]$指的是FJ独自过河的时间) 这样就可以做一个$n$方的DP了 #include<cstdio> #include<algorithm> #define rg register #define inf (1e9) #define N (1000

Bzoj 2718: [Violet 4]毕业旅行 &amp;&amp; Bzoj 1143: [CTSC2008]祭祀river 传递闭包,二分图匹配,匈牙利,bitset

1143: [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1878  Solved: 937[Submit][Status][Discuss] Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河道连接着两个岔口,并且水在河道内按照一个固定的方向流动.

BZOJ 1143: [CTSC2008]祭祀river 最长反链

1143: [CTSC2008]祭祀river Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1143 Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河道连接着两个岔口,并且水在河道内按照一个固定