hdu1151(二分图最大独立集)

原创 2016年05月31日 20:18:10

Air Raid

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4575    Accepted Submission(s): 3062


Problem Description
Consider a town where all the streets are one-way and each street leads from one intersection to another. It is also known that starting from an intersection and walking through town's streets you can never reach the same intersection i.e. the town's streets form no cycles.

With these assumptions your task is to write a program that finds the minimum number of paratroopers that can descend on the town and visit all the intersections of this town in such a way that more than one paratrooper visits no intersection. Each paratrooper lands at an intersection and can visit other intersections following the town streets. There are no restrictions about the starting intersection for each paratrooper.
 

Input
Your program should read sets of data. The first line of the input file contains the number of the data sets. Each data set specifies the structure of a town and has the format:

no_of_intersections
no_of_streets
S1 E1
S2 E2
......
Sno_of_streets Eno_of_streets

The first line of each data set contains a positive integer no_of_intersections (greater than 0 and less or equal to 120), which is the number of intersections in the town. The second line contains a positive integer no_of_streets, which is the number of streets in the town. The next no_of_streets lines, one for each street in the town, are randomly ordered and represent the town's streets. The line corresponding to street k (k <= no_of_streets) consists of two positive integers, separated by one blank: Sk (1 <= Sk <= no_of_intersections) - the number of the intersection that is the start of the street, and Ek (1 <= Ek <= no_of_intersections) - the number of the intersection that is the end of the street. Intersections are represented by integers from 1 to no_of_intersections.

There are no blank lines between consecutive sets of data. Input data are correct.
 

Output
The result of the program is on standard output. For each input data set the program prints on a single line, starting from the beginning of the line, one integer: the minimum number of paratroopers required to visit all the intersections in the town.
 

Sample Input
2 4 3 3 4 1 3 2 3 3 3 1 3 1 2 2 3
 

Sample Output
2 1

题意:给出一个有向图,现在空降伞兵,要让最少的伞兵遍历完该图,求最小的伞兵数目。

思路:很明显的二分图最大独立集的题。

二分图模板请参照:http://blog.csdn.net/martinue/article/details/51548708

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
const int N=555;///两边的最大数量
bool tu[N][N];
int from[N];///记录右边的点如果配对好了它来自哪里
bool use[N];///记录右边的点是否已经完成了配对
int n,m;///m,n分别表示两边的各自数量,n是左边,m是右边
bool dfs(int x)
{
    for(int i=1; i<=m; i++) ///m是右边,所以这里上界是m
        if(!use[i]&&tu[x][i])
        {
            use[i]=1;
            if(from[i]==-1||dfs(from[i]))
            {
                from[i]=x;
                return 1;
            }
        }
    return 0;
}
int hungary()
{
    int tot=0;
    memset(from,-1,sizeof(from));
    for(int i=1; i<=n; i++) ///n是左边,所以这里上界是n
    {
        memset(use,0,sizeof(use));
        if(dfs(i))
            tot++;
    }
    return tot;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(tu,0,sizeof(tu));
        int x;
        scanf("%d%d",&n,&x);
        m=n;
        while(x--)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            tu[a][b]=1;
        }
        printf("%d\n",n-hungary());
    }
    return 0;
}


版权声明:本文为博主原创文章,若转载请注明转载地址http://blog.csdn.net/martinue。

相关文章推荐

HDU OJ 3829 Cat VS Dog 【二分图之最大独立集】

原题链接:点击打开链接 题意:…… 思路:根据人物喜欢和不喜欢猫狗的编号来建立二分图,若两个人的喜欢,不喜欢 矛盾,则建立边,就把问题转化为求图的最大独立集。 二分图的最大独立集数=节点数(...

HDU2768二分图求最大独立集

/************************************************************* 题意: 给你n只猫,m只狗,p个人; 每个人都有一只喜欢的和一只讨厌的动物...
  • Jarily
  • Jarily
  • 2012年11月24日 21:39
  • 864

hdu 3517 Adopt or not(二分图最大独立集关键点)

//hdu3517 //最大独立集 //此题求独立集中的关键点 //对于某点,如果未匹配(cx[i]==-1,cy[i]==-1),肯定在关键点中 //对于匹配中的点,若此点不是匹配中的关键点,那么删...

hdu5556 2015ACM合肥现场赛题 二分图最大独立集

题意 在一个n*m的矩阵中,标记为’.’的为单独的一个点,标记为同一个数字的单元格和在一起是一个点,且是四联通的,为你这样建图之后它的最大独立集。 n,m ...

HDU 3829 Cat VS Dog(最大独立集|二分图最大匹配)

题意: 有 n 只cat和 m 只dog,有 c 个小朋友,知道了每个小朋友喜欢的动物和不喜欢的动物, 现在可以将其中一些动物移走,如果剩下的动物中有某个小朋友喜欢的而没有他不喜欢的,这个小朋友就会很...

HDU1054Strategic Game【二分图最大独立集】

Problem Description Bob enjoys playing computer games, especially strategic games, but sometimes ...

hdu 1068 Girls and Boys 二分图匹配 最大独立集

Problem Description the second year of the university somebody started a study on the romantic rela...
  • winycg
  • winycg
  • 2016年03月21日 17:52
  • 110

二分图最大独立集题目汇总 HDU3829,POJ1446、2771

HDU 3829 #include #include #include #include using namespace std; struct people{ char ch1,ch2...

hdu 3829 二分图最大独立集

//Cat VS Dog.cpp : 定义控制台应用程序的入口点。 // /* 题目描述:动物园有N只猫,M只狗,P个小孩。每个小孩都有自己喜欢的动物和讨厌的动物,如果他喜欢狗,那么就讨厌猫, 如果他...

HDU 2768Cat vs. Dog二分图 最大独立集(最大匹配)

今天做的二分图唯一一个比较难的 而且看了题解才发现,又理解错题意了。是说 如果出现喜欢的和别人讨厌的相同,则其中一人会不满意。问最多满意多少人 即把喜欢喝讨厌彼此矛盾的建边,个数-最大匹配即为所求 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu1151(二分图最大独立集)
举报原因:
原因补充:

(最多只允许输入30个字)