HDU 3395 Special Fish(KM算法)

原创 2017年01月03日 15:40:15
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=100+5;
int w[maxn][maxn],n;
int lx[maxn],ly[maxn];
int Left[maxn];
bool s[maxn],t[maxn];
int val[maxn];
char map[maxn][maxn];
bool match(int i)
{
    s[i]=true;
    for(int j=1;j<=n;j++) if(lx[i]+ly[j]==w[i][j]&&!t[j]){
        t[j]=true;
        if(!Left[j]||match(Left[j])){
            Left[j]=i;
            return true;
        }
    }
    return false;
}
void update()
{
    int a=(1<<30);
    for(int i=1;i<=n;i++) if(s[i])
        for(int j=1;j<=n;j++) if(!t[j])
            a=min(a,lx[i]+ly[j]-w[i][j]);
    for(int i=1;i<=n;i++){
        if(s[i]) lx[i]-=a;
        if(t[i]) ly[i]+=a;
    }
}
void KM()
{
    for(int i=1;i<=n;i++){
        Left[i]=lx[i]=ly[i]=0;
        for(int j=1;j<=n;j++)
            lx[i]=max(lx[i],w[i][j]);
    }
    for(int i=1;i<=n;i++){
        for(;;)
        {
            for(int j=1;j<=n;j++) s[j]=t[j]=0;
            if(match(i)) break;else update();
        }
    }
}
int main()
{
    while(scanf("%d",&n)&&n)
    {
        memset(w,0,sizeof(w));
        for(int i=1;i<=n;i++) scanf("%d",&val[i]);
        for(int i=1;i<=n;i++) scanf("%s",map[i]+1);
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(map[i][j]=='1') w[i][j]=(val[i]^val[j]);
        KM();
        int ans=0;
        for(int i=1;i<=n;i++) ans+=w[Left[i]][i];
        printf("%d\n",ans);
    }
    return 0;
}

HDU 3395 Special Fish(最大费用流)

Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T...
  • u010372095
  • u010372095
  • 2015年07月04日 11:20
  • 550

HDU_3395_Special Fish(最大费用最大流)

题意:有n条鱼,每条鱼最多可攻击其他鱼一次,被别人攻击一次。题目给出一个n*n的矩阵,如果matrix[i][j] == 0,表示 i 不攻击 j;如果matrix[i][j] == 1,表示 i 可...
  • jhgkjhg_ugtdk77
  • jhgkjhg_ugtdk77
  • 2015年10月07日 17:23
  • 389

HDU 3395 Special Fish(KM)

这是一道KM模板题,函数部分都是一样的,只是建图不同。这里的建图是如果01矩阵中数字是1的话,那么第i条鱼攻击第j条鱼时,所产生的鱼卵数是第i条鱼和第j条鱼的异或值; #include #inclu...
  • zs120197
  • zs120197
  • 2016年07月31日 10:14
  • 151

HDU 3395 Special Fish

此题解转载自 #include #include #include #include #include #include #include #include ...
  • u013007900
  • u013007900
  • 2014年08月30日 11:49
  • 527

HDU 3395 special fish

http://acm.hdu.edu.cn/showproblem.php?pid=3395#include #include using namespace std; #define N 20...
  • ME4546
  • ME4546
  • 2011年05月11日 20:12
  • 641

hdu 3395 Special Fish(费用流//KM匹配)

Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot...
  • u010126535
  • u010126535
  • 2013年11月06日 21:00
  • 481

HDU 3395 Special Fish KM水题

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3395 题意:有一种有价值的鱼都自认为是雄鱼,会攻击它认为是雌鱼的鱼,被攻击的鱼会产卵,卵的价值是父母的价值...
  • discreeter
  • discreeter
  • 2015年12月16日 19:42
  • 408

hdu 3395 Special Fish

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3395 题目大意:求交配后代 的最大值,注意每只鱼最多攻击别的一次和被攻击一次 题目思路:可能交配的...
  • sdjzli
  • sdjzli
  • 2013年02月21日 16:22
  • 611

hdu(3395)Special Fish

KM裸题 每个鱼都认为自己是雄性,而且会攻击它认为是雌性的鱼,每个鱼只能被攻击一次,被攻击后会产卵(个数是给的两条鱼的值的异或运算) 这个题的意思不太好理解。。 #include #include #...
  • u011519618
  • u011519618
  • 2013年08月03日 22:17
  • 392

HDU 3395 Special Fish KM算法+邻接矩阵建图

题意:一个点可以连一些点,但每个点这能被用一次,权值是两点权值的异或,求匹配权值最大。 想法:简单的KM,但是用前向星就超时,郁闷啊! #include #include #inc...
  • Triple_WDF
  • Triple_WDF
  • 2015年11月30日 10:21
  • 412
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 3395 Special Fish(KM算法)
举报原因:
原因补充:

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