POJ 3686 The Windy's KM算法 (二)

2015-01-24 06:28:47 · 作者: · 浏览: 12
???? memset(visx, 0, sizeof(visx));
??????????? memset(visy, 0, sizeof(visy));
??????????? if(find(x)) break;
??????????? int d = INF;
??????????? for(int i = 1; i <= ny; i++)
??????????????? if(!visy[i]) d = min(d, slack[i]);
??????????? if(d == INF) return -1;
??????????? for(int i = 1; i <= nx; i++)
??????????????? if(visx[i]) lx[i] -=d;
??????????? for(int i = 1; i <= ny; i++)
??????????????? if(visy[i]) ly[i] += d;
??????????????????? else slack[i] -= d;
??????? }
??? }
??? int tp = 0;
??? for(int i = 1; i <= ny; i++)
??????? if(linky[i] != -1) tp += w[linky[i]][i] - 5000000;
??? return -tp;
}
int a[MAXN][MAXN];
int main()
{
??? int T;
??? scanf("%d", &T);
??? while(T--)
??? {
??????? memset(w, 0, sizeof(w));
??????? scanf("%d%d", &n, &m);
??????? for(int i = 1; i <= n; i++)
??????????? for(int j = 1; j <= m; j++)
??????????????? scanf("%d", &a[i][j]);
??????? for(int i = 1; i <= n; i++)
??????????? for(int j = 1; j <= m; j++)
??????????????? for(int k = 1; k <= n; k++)
??????????????????? w[i][(j - 1) * n + k] = 5000000 - a[i][j] * k;
??????? nx = n;www.2cto.com
??????? ny = n * m;
??????? double ans = 1.0 * KM() / n;
??????? printf("%f\n", ans);
??? }
??? return 0;
}


?


作者:sdj222555