zoukankan      html  css  js  c++  java
  • UVA 10746 Crime Wave The Sequel

    UVA_10746

        这个题目可以用最小费用最大流去做,为了复习一下二分图最优匹配,所以写了一个KM的程序。

        一开始由于之前没有处理过double的KM,本来打算先把小数乘10的某次方化成整数来做,但发现一直WA,后来干脆就用double去写了,之后就AC了。

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #define MAXD 30
    #define INF 1000000000
    int N, M, xM[MAXD], yM[MAXD] ,visx[MAXD], visy[MAXD];;
    double G[MAXD][MAXD], MAX = 10000000.0;
    double slack, A[MAXD], B[MAXD];
    int init()
    {
    int i, j;
    double temp;
    scanf("%d%d", &N, &M);
    if(!N && !M)
    return 0;
    MAX = 10;
    for(i = 0; i < N; i ++)
    for(j = 0; j < M; j ++)
    {
    scanf("%lf", &temp);
    G[i][j] = MAX - temp;
    }
    return 1;
    }
    int searchpath(int u)
    {
    int v;
    double temp;
    visx[u] = 1;
    for(v = 0; v < M; v ++)
    if(!visy[v])
    {
    temp = A[u] + B[v] - G[u][v];
    if(fabs(temp) < 1e-9)
    {
    visy[v] = 1;
    if(yM[v] == -1 || searchpath(yM[v]))
    {
    xM[u] = v;
    yM[v] = u;
    return 1;
    }
    }
    else if(temp < slack)
    slack = temp;
    }
    return 0;
    }
    void KM()
    {
    int i, j, u;
    memset(xM, -1, sizeof(xM));
    memset(yM, -1, sizeof(yM));
    for(i = 0; i < N; i ++)
    {
    A[i] = 0;
    for(j = 0; j < M; j ++)
    if(G[i][j] > A[i])
    A[i] = G[i][j];
    }
    memset(B, 0, sizeof(B));
    for(u = 0; u < N; u ++)
    for(;;)
    {
    memset(visx, 0, sizeof(visx));
    memset(visy, 0, sizeof(visy));
    slack = INF;
    if(searchpath(u))
    break;
    for(i = 0; i < N; i ++)
    if(visx[i])
    A[i] -= slack;
    for(i = 0; i < M; i ++)
    if(visy[i])
    B[i] += slack;
    }
    }
    void printresult()
    {
    int i;
    double res = 0.0;
    for(i = 0; i < N; i ++)
    res += MAX - G[i][xM[i]];
    printf("%.2f\n", res / N);
    }
    int main()
    {
    while(init())
    {
    KM();
    printresult();
    }
    return 0;
    }


  • 相关阅读:
    F
    Common Subsequence
    Neighbor House
    Robberies(背包)
    Stock Exchange(LIS最长上升子序列问题)
    Compromise(LCS)
    POJ-3356 AGTC (最短编辑距离问题)
    Monkey and Banana(LIS最长上升子序列)
    网络编程之网络协议
    面向对象高级
  • 原文地址:https://www.cnblogs.com/staginner/p/2224321.html
Copyright © 2011-2022 走看看