UVA 11383

来源:互联网 发布:各种排序算法的比较 编辑:程序博客网 时间:2024/04/29 13:48
题意无关 完全套结论
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>//#include<map>#include<queue>#include<stack>#include<cmath>#include<vector>#define inf 0x3f3f3f3f#define Inf 0x3FFFFFFFFFFFFFFFLL#define pi acos(-1.0)#define ls (rt<<1)#define rs ((rt<<1)|1)#define mid ((l+r)>>1)using namespace std;const int maxn = 550;const double eps = 1e-10;int  w[maxn][maxn];int n;int lx[maxn],ly[maxn];   //顶标int lf[maxn];bool s[maxn],t[maxn];     //左右第i点是否标记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(!lf[j]||match(lf[j]))        {            lf[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;    }}int km(){//    for(int i=1;i<=n;i++)        for(int i=1;i<=n;++i)        {                     lf[i]=ly[i]=0;          lx[i]=*max_element(w[i]+1,w[i]+n+1);        }    for(int i=1;i<=n;++i)    {        while(1)        {            for(int j=1;j<=n;++j) s[j]=t[j]=0;                if(match(i))break;                 else update();        }    }    int res=0;    for(int i=1;i<=n;++i){res+=lx[i];res+=ly[i];}    return res;}int main(){    while(~scanf("%d",&n))    {        memset(w,0,sizeof w);        for(int i=1;i<=n;++i)            for(int j=1;j<=n;++j)                scanf("%d",&w[i][j]);        int ans=km();        for(int i=1;i<=n;i++)        {            if(i==1)printf("%d",lx[i]);            else printf(" %d",lx[i]);        }        puts("");        for(int i=1;i<=n;i++)        {            if(i==1)printf("%d",ly[i]);            else printf(" %d",ly[i]);        }        puts("");        printf("%d\n",ans);    }}

0 0
原创粉丝点击