input | output |
---|---|
4 62 41 86 94 73 58 11 12 69 93 89 88 81 40 69 13 |
650 |
Tags: graph theory
)
天呢!原谅哥这次套一次 自己没有理解的模版吧 ~感觉好难受~ ,时间紧迫 !~也只能这样了。测试了一下模版是对的。1a,然后我就会把它弄到我的小模版库~,的确 有些东西确实很难理解,但是应该用这个时间干点儿更有意义的事儿 !第一次套黑盒代码。嘿嘿~
#include<iostream> #include<sstream> #include<algorithm> #include<cstdio> #include<string.h> #include<cctype> #include<string> #include<cmath> #include<vector> #include<stack> #include<queue> #include<map> #include<set> using namespace std; const int INF=10000; int W[INF][INF],n; int Lx[INF],Ly[INF];// int Left[INF]; // bool S[INF],T[INF];// int sum[INF]; int matrix[INF][INF]; 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; } } int 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 sum = 0; for(int i = 1; i <= n; i ++) if(match[i] > 0) sum += W[Left[i]][i]; return sum; } int main() { while(cin>>n) { memset(sum,0,sizeof(sum)); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { scanf("%d",&matrix[i][j]); sum[j]+=matrix[i][j]; } for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) W[i][j]=-(sum[j]-matrix[i][j]); cout<<-KM()<<endl; } return 0; }
原文地址:http://blog.csdn.net/lsgqjh/article/details/46640587