縲先怙蟆乗?蠖「蝗セ縲粗dmonds邂玲ウ?驍サ謗・髦オ蠖「蠑?螟肴揩蠎ヲO(n3), 霑泌屓譛?ー冗函謌先?逧?柄蠎ヲ,譫??螟ア雍・霑?蝗櫁エ溷?,莨??蝗セ逧?、ァ蟆熟蜥碁そ謗・髦オmat,荳咲嶌驍サ轤ケ霎ケ譚ナnf,蜿ッ譖エ謾ケ霎ケ譚?噪邀サ蝙?pre[]霑泌屓譬醍噪譫??,逕ィ
辷カ扈鍋せ陦ィ遉コ,莨??譌カpre[]謨ー扈?ク?峺,逕ィ-1譬??貅千せ.
[豕ィ諢従豕ィ諢城怙隕∝?蛻、譁ュ譬ケ譏ッ蜷ヲ蜿ッ莉・蛻ー霎セ莨??蝗セ逧?ッ丈ク?クェ鬘カ轤ケ蜀堺スソ逕ィ
[萓矩「肋 UVA 11865 Stream My Contest
#include <string.h>
#define MAXN 120
#define inf 1000000000
typedef int elem_t;
elem_t edmonds(int n,elem_t mat[][MAXN*2],int* pre){
elem_t ret=0;
int c[MAXN*2][MAXN*2],l[MAXN*2],p[MAXN*2],m=n,t,i,j,k;
for (i=0;i<n;l[i]=i,i++);
do{
memset(c,0,sizeof(c)),memset(p,0xff,sizeof(p));
for (t=m,i=0;i<m;c[i][i]=1,i++);
for (i=0;i<t;i++)
if (l[i]==i&&pre[i]!=-1){
for (j=0;j<m;j++)
if (l[j]==j&&i!=j&&mat[j][i]<inf&&
(p[i]==-1||mat[j][i]<mat[p[i]][i]))
p[i]=j;
if ((pre[i]=p[i])==-1)
return -1;
if (c[i][p[i]]){
for (j=0;j<=m;mat[j][m]=mat[m][j]=inf,j++);
for (k=i;l[k]!=m;l[k]=m,k=p[k])
for (j=0;j<m;j++)
if (l[j]==j){
if (mat[j][k]-mat[p[k]][k]<mat[j][m])
mat[j][m]=mat[j][k]-mat[p[k]][k];
if (mat[k][j]<mat[m][j])
mat[m][j]=mat[k][j];
}
c[m][m]=1,l[m]=m,m++;
}
for (j=0;j<m;j++)
if (c[i][j])
for (k=p[i];k!=-1&&l[k]==k;c[k][j]=1,k=p[k]);
}
}
while (t<m);
for (;m-->n;pre[k]=pre[m])
for (i=0;i<m;i++)
if (l[i]==m){
for (j=0;j<m;j++)
if (pre[j]==m&&mat[i][j]==mat[m][j])
pre[j]=i;
if (mat[pre[m]][m]==mat[pre[m]][i]-mat[pre[i]][i])
k=i;
}
for (i=0;i<n;i++)
if (pre[i]!=-1)
ret+=mat[pre[i]][i];
return ret;
}