标签:des style http color os java io strong ar
2 100 10 15 23
123
#include<stdio.h> #include<string> #include<iostream> #include<algorithm> using namespace std; int n; int w[305][305]; int lx[305],ly[305],link[305]; int s[305],t[305]; int match(int i){ s[i]=1; for(int j=1;j<=n;j++){ if(lx[i]+ly[j]==w[i][j] && !t[j]){ t[j]=1; if(!link[j] || match(link[j])){ link[j]=i; return 1; } } } return 0; } void update(){ int a=1<<20; 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++){ link[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++){ while(1){ for(int j=1;j<=n;j++) s[j]=t[j]=0; if(match(i)) break; else update(); } } int ret=0; for(int i=1;i<=n;i++){ if(link[i]){ ret+=w[link[i]][i]; } } return ret; } int main(){ while(scanf("%d",&n)!=EOF){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&w[i][j]); int ans=KM(); printf("%d\n",ans); } return 0; }
标签:des style http color os java io strong ar
原文地址:http://blog.csdn.net/my_acm/article/details/38925793