首页 > 代码库 > Bipartitegraph1442

Bipartitegraph1442

题意:

 

派一些伞兵去那个镇里,要到达所有的路口,有一些或者没有伞兵可以不去那些路口,只要其他人能完成这个任务。

 

每个在一个路口着陆了的伞兵可以沿着街去到其他路口。我们的任务是求出去执行任务的伞兵最少可以是多少个。

 

一个最小路径覆盖的问题:

路口是节点,街道是有向边

 

 

 最小路径覆盖 顶点数 – 二分最大匹配数。

 

/*

Problem: 1422  User: CSU_ACM1174

Memory: 188K  Time: 0MS

Language: C++  Result: Accepted

 

*/

 

#include<cstdio>

#include<cstring>

#include<cstdlib>

#define MAXN 125

 

bool map[MAXN][MAXN], vis[MAXN];

int link[MAXN];

int inter, k;

 

bool dfs( int u)

{

    int v;

    for( v = 1; v <= inter; v ++)

        if( map[u][v] && !vis[v])

        {

            vis[v] = true;

            if( link[v] == -1 || dfs( link[v]))

            {

                link[v] = u;

                return true;

            }

        }

    return false;

}

 

int MaxMatch()

{

    int u, ret = 0;

    memset( link, -1, sizeof link);

    for( u = 1; u <= inter; u ++)

    {

        memset( vis, false, sizeof vis);

        if( dfs(u)) ret ++;

    }

    return ret;

}

 

int main()

{

    int cas;

    scanf( "%d", &cas);

    while( cas --)

    {

        scanf( "%d%d", &inter, &k);//路口数,街道数

        memset( map, false, sizeof map);

        for( int i = 1; i <= k; i ++)

        {

            int x, y;

            scanf( "%d%d", &x, &y);

            map[x][y] = true;

        }

        int ans = MaxMatch();

        printf( "%d\n", inter - ans);// 最小路径覆盖 顶点数 – 二分最大匹配数。

    }

    return 0;

}

Bipartitegraph1442