poj 2112

来源:互联网 发布:淘宝直通车卡位软件 编辑:程序博客网 时间:2024/06/05 23:05

 

最开始没有看明白题意.. 没有floyd 各种错 后来又没有更新那个maxans 改了就过了

 

#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;

const int MAXN = 502;
const int inf = 0xffffff;
// 二分图匹配,返回最大的匹配数
// linker中保存匹配的关系
int g[MAXN][MAXN];
int n , m;
int linker[MAXN];
bool used[MAXN];

bool DFS ( int  a )
{
    for ( int i = 0 ; i < m; i ++ )
        if ( g[a][i] && !used[i] )
        {
            used[i] = true ;
            if ( linker[i] == -1 || DFS( linker[i] ))
            {
                linker[i] = a;
                return true;
            }
        }
    return false;
}

int hungray ( )
{
    int result = 0;
    memset ( linker , -1 , sizeof ( linker )) ;
    for ( int i = 0 ; i < n; i ++ )
    {
        memset ( used , 0 , sizeof ( used )) ;
        if ( DFS ( i ) )
            result ++;
    }
    return result;
}

int map[MAXN][MAXN];

void floyd ( int s )
{
    for ( int k = 0 ; k < s ; k ++ )
        for ( int i = 0 ; i < s ; i ++ )
            for ( int j = 0 ; j < s ;j ++ )
                if ( map[i][j] > map[i][k] + map[k][j] )
                    map[i][j] = map[i][k] + map[k][j];
}

int main()
{
   int k , c , s;
   int maxans ;
   while ( scanf("%d%d%d" , &k ,&c , &s ) != EOF )
   {
       maxans = 0;
        for ( int i = 0 ; i < k+c ; i ++ )
            for ( int j = 0 ; j < k+c ; j ++ )
            {
                scanf("%d" , &map[i][j] );
                if ( map[i][j] > maxans )
                    maxans = map[i][j];
                if ( map[i][j] == 0 )
                    map[i][j] = inf;
            }
        floyd ( k+c );
//        cout << endl;
//        for ( int i = 0 ; i < k+c ; i ++)
//          {
//
//           for ( int j = 0 ; j  < k+c ; j ++ )
//
//                cout << map[i][j] << " " ;
//            cout << endl;
//            }


        for ( int i = 0 ; i < k+c ; i ++ )
            for ( int j = 0 ; j < k+c ; j ++ )
                if ( map[i][j] > maxans )
                    maxans = map[i][j];


        int ans = inf;
        //cout << maxans << endl;
        int minans = 0;
        int node;
        while ( minans <= maxans )
        {
            node = 0;
            int mid = ( minans + maxans )/2;
            memset ( g, 0 , sizeof ( g ));
            for ( int i = 0 ; i < k ; i ++ )
                for ( int j = k ; j < k+c ; j ++)
                if ( map[i][j] <= mid )
                {
                    for ( int t = 0 ; t < s ; t ++ )
                        g[i*s+t][j-k] = 1;
                }
            n = k*s;
            m = c;
            //cout << hungray () << endl;
            if ( hungray() == c )
            {
                if ( mid < ans ) ans = mid ;//cout << "ans = " << ans << endl;
                maxans = mid - 1;
            }
                //maxans = ans;
            else if ( hungray() < c )
                minans = mid + 1;
           //cout << minans << " ***** " << maxans << endl;
        }
        printf("%d\n", ans );
   }
    return 0;
}

/*
2 3 3
0 3 2 1 1
3 0 3 2 0
2 3 0 1 0
1 2 1 0 2
1 0 0 2 0

1 1 1
0 1
1 0

1 2 2
0 2 3
2 0 2
3 2 0

2 1 1
0 2 2
2 0 1
2 1 0

*/


 

原创粉丝点击