SGU 218.Unstable Systems

题意:

有n(n<500)台机器,和500个程序。不同的程序在不同的机器上运行有着不同的不稳定度s[i][j]。求最小的最大稳定度及其方案。


Solution:

比较经典的二分图模型。
建图很简单。直接将$s[i][j]$作为图的邻接矩阵。
看到求最小的最大稳定度,想到二分答案。
check的话,只要利用所有小于等于当前二分的$ans$的边求二分图的最大匹配。如果$ 最大匹配=n $ 那么当前解是可行的。
十分要注意的是权值可能为负!

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;
const int N = 501;
int link[N], vis[N];
int G[N][N],ans[N];
int n, mid;
bool DFS ( int x )
{
    for ( int i = 1; i <= n; i++ )
        if ( G[x][i] <= mid && !vis[i] ) {
            vis[i] = 1;
            if ( link[i] == -1 || DFS ( link[i] ) ) {
                link[i] = x;
                return 1;
            }
        }
    return 0;
}
bool check()
{
    int ans = 0;
    memset ( link, -1, sizeof link );
    for ( int i = 1; i <= n; i++ ) {
        memset ( vis, 0, sizeof vis );
        if ( DFS ( i ) ) ans++;
    }
    return ans == n;
}
int main()
{
    scanf ( "%d", &n );
    for ( int i = 1; i <= n; ++i ) {
        for ( int j = 1; j <= n; ++j ) {
            scanf ( "%d", &G[i][j] );
        }
    }
    int l = -int(1e6), r = int ( 1e6 );
    while ( l <= r ) {
        mid = ( l + r ) >> 1;
        if ( check () ) r = mid - 1;
        else
            l = mid + 1;
    }
    printf ( "%d\n", r + 1 );
    mid = r + 1;
    check();
    for ( int i = 1; i <= n; ++i ) {
        ans[link[i]]=i;
    }
    for ( int i = 1; i <= n; ++i ) {
        printf ( "%d %d\n", i, ans[i] );
    }
}
/*
3
100 1 100
100 100 1
1 100 100
*/

posted @ 2015-07-20 20:54  keambar  阅读(512)  评论(0编辑  收藏  举报