hdu 1498

来源:互联网 发布:天猫魔盒好用软件 编辑:程序博客网 时间:2024/06/06 20:11

多做题,学建图ING

#include <iostream>#include <cstdio>#include <vector>#include <cstring>#define MAX 200using 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;}


原创粉丝点击