LOJ 1201 - A Perfect Murder(二分匹配 最大独立集)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1201


"Yes, I am the murderer. No doubt" I had to confess it in front of all. But wait, why I am confessing? Nobody wants to go to jail, neither do I. As you have suspected there is something fishy. So, let me explain a bit.

The murder was happened in 19th June, at 11:30 pm this year (2009) according to the medical report. So, I was asking the judge "Can you find the time 19th June 11:30 pm in Bangladesh?" The judge informed other reporters to find the time. But alas! There was no time - "2009, 19th June, 11:30 pm". So, the judge got a bit confused about my confession. So, I began to tell them, "The time the murder was happened, is not a valid time according to you. So, how can you claim that I am the murderer?"

And what happened next, you all know. I am in the streets again with a clean sheet.

But now I have planned to kill again. I have a list of N mosquitoes which are to be killed. But there is a small problem. If I kill a mosquito, all of his friends will be informed, so they will be prepared for my attack, thus they will be impossible to kill. But there is a surprising fact. That is if I denote them as a node and their friendship relations as edges, the graph becomes acyclic.

Now I am planning when and how to kill them (how to get rid of the law!) and you have to write a program that will help me to find the maximum number of mosquito I can kill. Don't worry too much, if anything goes wrong I will not mention your name, trust me!

Input

Input starts with an integer T (≤ 50), denoting the number of test cases.

Each case starts with a blank line and two integers N (1 ≤ N ≤ 1000) denoting the number of mosquito I want to kill and M denoting the number of friendship configurations. Each of the next M lines contains two integers a and b denoting that ath and bth mosquitoes are friends. You can assume that(1 ≤ a, b ≤ N, a ≠ b) and each friendship relation is given only once. As I have already mentioned, you will not find any cycle in the relations.

Output

For each case, print the case number and the maximum number of mosquitoes I can kill considering the conditions described above.

Sample Input

Output for Sample Input

3

 

4 3

1 2

1 3

1 4

 

3 2

1 2

2 3

 

5 4

1 2

1 3

2 4

2 5

Case 1: 3

Case 2: 2

Case 3: 3

 

PROBLEM SETTER: JANE ALAM JAN

PS:

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


代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
//顶点编号从1开始的
#define MAXN 1017
int LN, RN;//L,R数目
int g[MAXN][MAXN], linker[MAXN];
bool used[MAXN];
int dfs(int L)//从左边开始找增广路径
{
    int R;
    for(R = 1; R <= RN; R++)
    {
        if(g[L][R]!=0 && !used[R])
        {
            //找增广路,反向
            used[R]=true;
            if(linker[R] == -1 || dfs(linker[R]))
            {
                linker[R]=L;
                return 1;
            }
        }
    }
    return 0;//这个不要忘了,经常忘记这句
}
int hungary()
{
    int res = 0 ;
    int L;
    memset(linker,-1,sizeof(linker));
    for( L = 1; L <= LN; L++)
    {
        memset(used,0,sizeof(used));
        if(dfs(L) != 0)
            res++;
    }
    return res;
}
int main()
{
    int t;
    int n, m;
    int cas = 0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        memset(g,0,sizeof(g));

        for(int i = 1; i <= m; i++)
        {
            int x, y;
            scanf("%d%d",&x,&y);
            g[x][y] = 1;
            g[y][x] = 1;
        }
        LN = n;
        RN = n;
        int ans = hungary();//最大匹配数

        printf("Case %d: %d\n",++cas,n-ans/2);
    }
    return 0 ;
}


你可能感兴趣的:(二分匹配,最大独立集,LOJ)