| 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