`
xuela_net
  • 浏览: 497086 次
文章分类
社区版块
存档分类
最新评论

hdu 1498

 
阅读更多

多做题,学建图ING

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#define MAX 200
using namespace std;

int g[MAX][MAX];
int link[MAX],vis[MAX],map[MAX][MAX],mark[MAX],cnt[MAX];
int n,m,k;

int dfs(int u)
{
    int i;
    for(i=1; i<=n; i++)
    {
        if( g[u][i] && !vis[i] )
        {
            vis[i] = 1;
            if(link[i] == -1 || dfs(link[i]))
            {
                link[i] = u;
                return 1;
            }
        }
    }
    return 0;
}

int match()
{
    int i, ans = 0;
    for(i=1; i<=n; i++)
    {
        memset(vis,0,sizeof(vis));
        ans += dfs(i);
    }
    //cout << ans << endl;
    return ans;
}

void init()
{
    memset(link,-1,sizeof(link));
    memset(g,0,sizeof(g));
}

int main()
{
    int i,j,l,ans;
    while( scanf("%d%d",&n,&k) )
    {
        if(n == 0 && k == 0)
            break;
        memset(mark,0,sizeof(mark));
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
            {
                scanf("%d",&map[i][j]);
                mark[map[i][j]] = 1;
            }
        }
        for(l=1; l<=50; l++)
        {
            if(mark[l])
            {
                init();
                for(i=1; i<=n; i++)
                    for(j=1; j<=n; j++)
                    {
                        if(map[i][j] == l)
                            g[i][j] = 1;
                    }
                ans = match();
                if(ans <= k)
                    mark[l] = 0;
            }
        }
        int count = 0;
        for(i=1; i<=50; i++)
        {
            if(mark[i])
                cnt[count++] = i;
        }
        if(count == 0)
            cout << -1 << endl;
        else
        {
            for(i=0; i<count-1; i++)
            {
                cout << cnt[i] << ' ';
            }
            cout << cnt[count-1] << endl;
        }
    }
    return 0;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics