uva 2696 - Air Raid

http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=697

题意:给定有向无环图,每个点代表一个城市,一些城市之间有边,在城市上放伞兵,伞兵可以管理在他这条路径上的所有城市,问最小放多少个伞兵,可以经过每一个城市,

就是二分图的最小路径覆盖

View Code
#include<iostream>

#include<string.h>

#include<stdio.h>

#include<algorithm>

#include<vector>

#define maxn 10000

using namespace std;

vector<int>node[maxn];

int mm[maxn];

int visit[maxn];

int n,m;

void init()

{

    cin>>n>>m;

    for(int i=0;i<=n;i++)

    node[i].clear();

    for(int i=0;i<m;i++)

    {

        int a,b;

        cin>>a>>b;

        node[a].push_back(b);

    }

}

int dfs(int fa)

{

    for(int i=0;i<node[fa].size();i++)

    {

        int v=node[fa][i];

        if(!visit[v])

        {

            visit[v]=1;

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

            {

                mm[v]=fa;

                return 1;

            }

        }

    }

    return 0;

}

void solve()

{

    int cnt=0;

    memset(mm,-1,sizeof(mm));

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

    {

        memset(visit,0,sizeof(visit));

        if(dfs(i))cnt++;

    }

    cout<<n-cnt<<endl;

}

int main()

{

    int test;

    cin>>test;

    while(test--)

    {

        init();

        solve();

    }

    return 0;

}

你可能感兴趣的:(raid)