void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

这题跟1422原本以为一样求最短路径覆盖,后来知道,最短路径覆盖是每个点只能走一次,但是这个题目是可以走多次?我反复想就是不明白为什么??

后来看了一个图明白了

比如直接求最短路径覆盖的话,上图情况如果求出1-2匹配,2-4匹配,那么3-2-5这条路径就已经被切断不存在了,因为2不能再走了

实际上2还是可以走的。按照上图,答案是5-最大匹配=5-2=3,实际上答案是2

因此这个题用floyd先求一次闭包,再次求解就行了。

#include <stdio.h>
#include <string.h>
#define N 301
int match[N],map[N][N];
int cn,mn;
bool used[N];
int find(int x)
{
    for(int i=1;i<=cn;i++)
    if(!used[i]&&map[x][i])
    {
        used[i]=true;
        if(match[i]==-1||find(match[i]))
        {
            match[i]=x;
            return true;
        }

    }
    return false;
}

int Hungry()
{
    int sum=0;
    for(int i=1;i<=cn;i++)
    {
        memset(used,false,sizeof(used));
        if(find(i))sum++;
    }
    return sum;
}

int main()
{
    int num,st,ca;
    scanf("%d",&ca);
    while(ca--)
    {
        scanf("%d%d",&cn,&mn);
        memset(map,0,sizeof(map));
        memset(match,-1,sizeof(match));
        for(int i=1;i<=mn;i++)
        {
            scanf("%d%d",&num,&st);
                map[num][st]=1;
        }
        printf("%d\n",cn-Hungry());

    }

}
posted on 2011-08-28 21:55  void-man  阅读(735)  评论(0编辑  收藏  举报