• HDU 2583 Assignment


    HDU_2853

    我们可以想到,如果我们从头开始匹配,如果最终部分匹配改变之后但没有影响到最终结果的话,那么实际上我们完全没有必要变成新的匹配方式。因而我们考虑为原有的边增加一个“喜好度”,保证其在不影响结果的前提下,会优先匹配原有的边。

    在处理数据的时候,我们可以把每条边扩大一定的值(我的程序里面是乘以10),然后将原有的边的权值自加1,这样当我们用KM重新进行匹配时,就体现出了优先选已有的边进行匹配,并且这样处理之后并不会影响最优匹配的生成。

        最后统计结果的时候,我们对边权进行还原即可,其中更改的数量就是最优匹配中边权模10的结果不为0的边的数量。

    #include<stdio.h>
    #include<string.h>
    #define MAXD 60
    #define INF 1000000000
    int G[MAXD][MAXD], N, M, sum;
    int yM[MAXD], A[MAXD], B[MAXD], slack;
    int visx[MAXD], visy[MAXD];
    void init ()
    {
    int i, j;
    for(i = 0; i < N; i ++)
    for(j = 0; j < M; j ++)
    {
    scanf("%d", &G[i][j]);
    G[i][j] *= 10;
    }
    sum = 0;
    for(i = 0; i < N; i ++)
    {
    scanf("%d", &j);
    j --;
    sum += G[i][j] / 10;
    G[i][j] ++;
    }
    }
    int searchpath(int u)
    {
    int v, temp;
    visx[u] = 1;
    for(v = 0; v < M; v ++)
    if(!visy[v])
    {
    temp = A[u] + B[v] - G[u][v];
    if(temp == 0)
    {
    visy[v] = 1;
    if(yM[v] == -1 || searchpath(yM[v]))
    {
    yM[v] = u;
    return 1;
    }
    }
    else if(temp < slack)
    slack = temp;
    }
    return 0;
    }
    void KM()
    {
    int i, j, u;
    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));
    memset(yM, -1, sizeof(yM));
    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, ans = 0, cnt = 0;
    for(i = 0; i < M; i ++)
    if(yM[i] != -1)
    {
    if(G[yM[i]][i] % 10 == 0)
    cnt ++;
    ans += G[yM[i]][i] / 10;
    }
    printf("%d %d\n", cnt, ans - sum);
    }
    int main()
    {
    while(scanf("%d%d", &N, &M) == 2)
    {
    init();
    KM();
    printresult();
    }
    return 0;
    }


  • 相关阅读:
    一个群发站内信的设计
    javascript typeof 小结
    setInterval,setTimeout的用法
    C#中常见异常类
    输入框关闭自动完成功能
    【转】javascript判断一个元素是否数组
    jquery的动态统计输入字符数方法
    giedview绑定数据格式化字符串
    jQuery 1.4单独为某个动画动作设效果
    GridView行编辑中找DropDownList控件
  • 原文地址:https://www.cnblogs.com/staginner/p/2199335.html
Copyright © 2020-2023  润新知