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;
}

相关文章推荐

[ACM] HDU 3395 Special Fish (二分图最大权匹配,KM算法)

Special Fish Problem Description There is a kind of special fish in the East Lake where is...

【HDU】 3395 Special Fish 费用流(可KM匹配)

Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot...

HDU 3395 Special Fish KM水题

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3395 题意:有一种有价值的鱼都自认为是雄鱼,会攻击它认为是雌鱼的鱼,被攻击的鱼会产卵,卵的价值是父母的价值...

HDU 3395 Special Fish 费用流

//author: CHC //First Edit Time: 2014-10-11 20:13 //Last Edit Time: 2014-10-11 20:39 //求最大费用,不要求最大流 ...
  • CHCXCHC
  • CHCXCHC
  • 2014年10月28日 16:13
  • 393

hdu 3395 Special Fish【最大费用流】

Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

HDU 3395 Special Fish(费用流)

题目地址:HDU 3395 刷了几道白书和CF上的非算法题,感觉智商越来越接近负数了。。。还是先刷几道简单题缓缓。。 这题很简单,二分图模型,用费用流也可以,用KM也可以。不过需要注意的是这里是最大费...

HDU3395 Special fish(费用流)

此题属于费用流裸题,建一个源点和汇点,注意

HDU 3395 Special Fish(最大费用流)

Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T...

hdu 3395 Special Fish(费用流)

题意
  • qian99
  • qian99
  • 2014年04月16日 20:26
  • 517

hdu 3395 Special Fish(异或,最大费用任意流,最优匹配)

Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T...
  • acm_cxq
  • acm_cxq
  • 2016年08月03日 11:55
  • 439
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 3395 Special Fish(KM算法)
举报原因:
原因补充:

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